Когда я вставляю новые данные фейкера в свой прибор, мне нужно обновить многие утверждения, есть ли у вас какие-нибудь советы, как это исправить?

с некоторых пор я использую инструменты Faker (Python Faker, Php Faker, Ruby Faker... ) для создания моих приборов для моих тестов или моих демонстрационных данных.

Я хочу всегда получать одни и те же сгенерированные данные, тогда я использую функция случайного начального числа, вот очень простой пример:

import unittest
from faker import Faker
fake = Faker()
fake.seed(4321)

# My model
class Contact(object):
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

class TestCase(unittest.TestCase):
    def test_basic(self):
        c1 = Contact(fake.first_name(), fake.last_name())
        self.assertEqual(c1.firstname, u'Deonte')
        self.assertEqual(c1.lastname, u'Jaskolski')

        c2 = Contact(fake.first_name(), fake.last_name())
        self.assertEqual(c2.firstname, u'Anika')
        self.assertEqual(c2.lastname, u'Dare')

unittest.main()

Хорошо, все замечательно.

Далее я работаю над своим проектом, и мне нужно добавить новое поле в Contact :

class Contact(object):
    def __init__(self, firstname, lastname, city):
        self.firstname = firstname
        self.lastname = lastname
        self.city = city

Я обновляю свой тест:

class TestCase(unittest.TestCase):
    def test_basic(self):
        c1 = Contact(fake.first_name(), fake.last_name(), fake.city())
        self.assertEqual(c1.firstname, u'Deonte')
        self.assertEqual(c1.lastname, u'Jaskolski')
        self.assertEqual(c1.city, u'East Freddieside')

        c2 = Contact(fake.first_name(), fake.last_name(), fake.city())
        self.assertEqual(c2.firstname, u'Allison')
        self.assertEqual(c2.lastname, u'Dibbert')
        self.assertEqual(c2.city, u'West Leathabury')

Если вы посмотрите утверждения «c2.firstname» и «c2.lastname» в первом и втором тестах, вы увидите мою боль: когда я вставляю новые фальшивые данные в середине создания своих фикстур, мне нужно обновить все следующие утверждения. .

Это не проблема с небольшим тестом, но это очень болезненные множественные тесты.

У вас есть какие-нибудь советы по этому вопросу?

Я думал об использовании многих экземпляров генератора случайных чисел, как вы думаете, это хорошее направление?


person Stéphane Klein    schedule 23.01.2014    source источник


Ответы (2)


Вам просто нужно сначала установить данные, а затем создать утверждение на основе этих данных. Также я рекомендую использовать namedtuple и многоразовую фабрику.

ContactData = namedtuple('Contact', ['first_name', 'last_name', 'city'])
def contactFactory():
   return ContactData(fake.first_name(), fake.last_name(), fake.city())
d1 = contactFactory()
c1 = Contact(*d1) # or Contact(**vars(d1))
assert c1.first_name == d1.first_name
person gawel    schedule 23.01.2014

Это не хороший модульный тест, потому что он зависит от поведения библиотеки Faker. Исход теста может измениться, если создатели Faker изменят свой список имен. В то же время ваш код мог вообще не измениться.

Хороший тестовый пример должен быть автономным и тестировать очень конкретный фрагмент кода. Например,

class TestCase(unittest.TestCase):
    def test_basic(self):
        c1 = Contact(u'Deonte', u'Jaskolski', u'East Freddieside')
        self.assertEqual(c1.firstname, u'Deonte')
        self.assertEqual(c1.lastname, u'Jaskolski')
        self.assertEqual(c1.city, u'East Freddieside')

Опять же, с точки зрения Django, этот тестовый пример не нужен. Код Django довольно хорошо протестирован. Написание тестового примера для проверки правильности инициализации экземпляра модели было бы излишним.

person arocks    schedule 23.01.2014
comment
Я думаю, вы не понимаете цели Faker. С помощью фейкера я могу написать цикл и вставить 10000 строк с реальными данными. С вашим методом это невозможно. - person Stéphane Klein; 23.01.2014
comment
Я понимаю. Но я не понимаю, зачем вставлять 10000 строк случайных данных, а затем утверждать, какие значения были вставлены в тестовый пример. - person arocks; 23.01.2014