Программисты ленивы и редко пытаются учиться в реальных областях бизнеса
TL;DR: используйте реальные сценарии и реальные данные (когда это возможно)
Проблемы
- Нарушение биекции
- Плохие тестовые варианты использования
- Читабельность
Решения
- Сменить тестовые данные на реальные.
- Используйте 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.