Код от лекцията за автоматизирано тестване

  1. Във вторник Петър ме подръчка да test-drive-на имплементацията на третата функция от втора задача. Публикувам кодът тук. Не е завършено решение, но се надявам да илюстрирам какво е да правите test-driven development.

    import unittest
    
    def cache(func, size):
        storage = {}
    
        def cached(*args):
            if args in storage:
                return storage[args]
    
            result = func(*args)
            storage[args] = result
            return result
    
        return cached
    
    class ThingsTest(unittest.TestCase):
        def setUp(self):
            self.number_of_calls = 0
    
        def call_counter(self):
            def counter(x):
                self.number_of_calls += 1
            return counter
    
        def test_simple_caching(self):
            cached_function = cache(self.call_counter(), 10)
    
            cached_function(0)
            cached_function(0)
    
            self.assertEqual(1, self.number_of_calls)
    
        def test_calling_with_arguments(self):
            cached_function = cache(self.call_counter(), 10)
    
            cached_function(1)
            cached_function(2)
            cached_function(2)
    
            self.assertEqual(2, self.number_of_calls)
    
        def test_returns_the_result_from_the_original_call(self):
            def func(x):
                return 42
    
            self.assertEqual(42, cache(func, 10)(0))
    
    if __name__ == '__main__':
        unittest.main()
    

    Не съм имплементирал лимита на кеша. Ако желаете да се пробвате, можете да го довършите. Споделете крайния резултат и какво сте научили от упражнението и ще ви дадем бонус точка.

    Аз бих подходил по следния начин:

    1. Първо бих добавил тест, който да проверя че превишаването на лимита резултира в ново извикване.
    2. След това ще пропусна теста със @skip.
    3. Ще променя storage да не бъде речник, а да бъде списък от двойки ала [((1, 2), 'result'), ((3, 4), 'another result')]. След тази промяна искам тестовете да минават.
    4. Махам @skip от теста добавен в стъпка 1. Карам го да мине.
    5. В този момент подменям storage да бъде OrderedDict или някаква сходна структура.

    Някой сеща ли се защо?

    Публикувано преди
  2. Ако въпросът е към всички точки, то:

    Преди да пишем код, добавящ нова функционалност, първо му правим тест.

    Променяме структура в съществуващия код ( refactoring в някакъв смисъл ) и гледаме да минават тестовете без новия, още не имплементираме новата функционалност.

    Пускаме новия тест да се счупи и правим някакви магии, така че да имаме лимит на кеша.

    Сещаме се, че има по-яки решения и ги имплементираме смело. В случая, OrderedDict пази реда на вкарване на елементи в речника и няма нужда да правим двойки от пореден номер и аргументи примерно или два списъка...

    Публикувано преди

Трябва да сте влезли в системата, за да може да отговаряте на теми.