Программисты ленивы и редко пытаются учиться в реальных областях бизнеса

TL;DR: используйте реальные сценарии и реальные данные (когда это возможно)

Проблемы

  • Нарушение биекции
  • Плохие тестовые варианты использования
  • Читабельность

Решения

  1. Сменить тестовые данные на реальные.
  2. Используйте MAPPER для отображения реальных объектов и реальных данных.

Контекст

Раньше разработчики подделывали данные домена.

Мы посчитали Hello Word хорошей практикой и протестировали на абстрактных данных.

Мы разрабатывали по водопадной модели, очень далекой от реальных пользователей.

Благодаря методам биекции и MAPPER, DDD и TDD, приемочное тестирование пользователем стали более важными.

Используя методологии Agile, нам нужно тестировать на реальных данных.

Если мы находим ошибку в производственной системе, нам нужно добавить кейс, покрывающий точную ошибку с реальными данными.

Образец кода

Неправильный

class BookCartTestCase(unittest.TestCase):
    def setUp(self):
        self.cart = Cart()
    def test_add_book(self):
       self.cart.add_item('xxxxx', 3, 10)
        #This is not a real example
       self.assertEqual(self.cart.total, 30, msg='Book Cart total not correct after adding books')
       self.assertEqual(self.cart.items['xxxxx'], 3, msg='Quantity of items not correct after adding book')
    def test_remove_item(self):
        self.cart.add_item('fgdfhhfhhh', 3, 10)
        self.cart.remove_item('fgdfhhfhrhh', 2, 10)    
        #We made a typo since example is not a real one
        self.assertEqual(self.cart.total, 10, msg='Book Cart total not correct after removing book')
        self.assertEqual(self.cart.items['fgdfhhfhhh'], 1, msg='Quantity of books not correct after removing book')

Верно

class BookCartTestCase(unittest.TestCase):
    def setUp(self):
        self.cart = Cart()
    def test_add_book(self):
       self.cart.add_item('Harry Potter', 3, 10)
       self.assertEqual(self.cart.total, 30, msg='Book Cart total not correct after adding books')
       self.assertEqual(self.cart.items['Harry Potter'], 3, msg='Quantity of items not correct after adding book')
    #We don't reuse same example. 
    #We use a new REAL book
    def test_remove_item(self):
        self.cart.add_item('Divergent', 3, 10)
        self.cart.remove_item('Divergent', 2, 10)    
        self.assertEqual(self.cart.total, 10, msg='Book Cart total not correct after removing book')
        self.assertEqual(self.cart.items['Divergent'], 1, msg='Quantity of books not correct after removing book')

Обнаружение

[Х] Руководство

Это смысловой запах.

Теги

  • Тестирование

Заключение

Комментарии к коду — это запах кода.

Чтение тестов — единственный способ узнать, как ведет себя программное обеспечение.

Нам нужно быть более явными в наших тестах.

Исключения

На некоторых доменах и в соответствии с законодательством мы не можем использовать реальные данные.

Мы должны подделать его с помощью значимых данных.

связи



Больше информации

Кредиты

Благодаря Кертису Эйнсманну

Вы ничего не понимаете, если не можете объяснить это своей бабушке.

Альберт Эйнштейн



Эта статья является частью серии CodeSmell.