Генерация данных фикстуры с помощью модуля фикстуры Python

Я впервые работаю с модулем фикстуры, пытаясь получить лучший набор данных фикстуры, чтобы сделать наши функциональные тесты более полными.

Я нахожу модуль приспособления немного неуклюжим, и я надеюсь, что есть лучший способ сделать то, что я делаю. Это приложение Flask/SQLAlchemy на Python 2.7, и мы используем нос в качестве средства запуска тестов.

Итак, у меня есть набор сотрудников. У сотрудников есть роли. Есть несколько страниц с довольно сложными разрешениями, и я хотел бы убедиться, что они протестированы.

Я создал набор данных, в котором есть роли каждого типа (в нашем приложении около 15 ролей):

class EmployeeData(DataSet):

  class Meta:
    storable = Employee

  class engineer:
    username = "engineer"
    role = ROLE_ENGINEER

  class manager:
    username = "manager"
    role = ROLE_MANAGER

  class admin:
    username = "admin"
    role = ROLE_ADMIN

и что я хотел бы сделать, так это написать функциональный тест, который проверяет, что только нужные люди могут получить доступ к странице. (Настоящие разрешения намного сложнее, я просто хотел показать вам игрушечный пример.)

Что-то вроде этого:

def test_only_admin_can_see_this_page():

  for employee in Employee.query.all():
    login(employee)

    with self.app.test_request_context('/'):
    response = self.test_client.get(ADMIN_PAGE)
    if employee.role == ROLE_ADMIN
      eq_(200, response.status_code)
    else:
      eq_(401, response.status_code)

    logout(employee)

Есть ли способ сгенерировать данные фикстуры, чтобы моим разработчикам не приходилось помнить о добавлении строки в фикстуры каждый раз, когда мы добавляем роль? У нас есть канонический список всех ролей в качестве конфигурации в другом месте приложения, поэтому он у меня есть.

Я не привязан ни к чему из этого или к модулю крепления, поэтому я рад услышать предложения!


person Rachel Sanders    schedule 20.11.2012    source источник
comment
Вы когда-нибудь придумывали хороший подход для этого?   -  person Eli    schedule 03.07.2015
comment
Я опубликовал (довольно поздний) ответ, и мне было интересно, вы нашли его полезным?   -  person John Moutafis    schedule 24.05.2018


Ответы (1)


Можно использовать factory_boy для создания тестовых данных.

  • Предполагая, что вы сохраняете и соответственно обновляете список ролей (которые будут использоваться позже), как этот:

    roles = [ROLE_ENGINEER, ROLE_ADMIN, ROLE_MANAGER, ...]
    
  • Создадим фабрику для таблицы Employee:

    import factory
    from somewhere.in.the.app import roles
    
    class EmployeeFactory(factory.alchemy.SQLAlchemyModelFactory):
        class Meta:
            model = Employee
            sqlalchemy_session = session
    
        username = factory.Sequence(lambda n: u'User %d' % n)
        # Other attributes
        ...
        # Now the role choice
        role = factory.fuzzy.FuzzyChoice(roles)
    

    Метод FuzzyChoice берет список вариантов и делает случайный выбор из этот список.
    Теперь он сможет создавать любое количество Employee объектов по требованию.

  • Использование фабрики:

    from factory.location import EmployeeFactory
    
    def test_only_admin_can_see_this_page():
        EmployeeFactory.create_batch(size=100)
    
        for employee in session.query(Employee).all():
            login(employee)
    
            with self.app.test_request_context('/'):
            response = self.test_client.get(ADMIN_PAGE)
            if employee.role == ROLE_ADMIN
                eq_(200, response.status_code)
            else:
                eq_(401, response.status_code)
    
            logout(employee)
    

    Разбивка:

    • EmployeeFactory.create_batch(size=100) Creates 100 Employee objects in the test session.
    • Мы можем получить доступ к этим объектам с фабрики session.

Дополнительные сведения об использовании factory_boy с SQLAlchemy: https://factoryboy.readthedocs.io/en/latest/orms.html?highlight=sqlalchemy#sqlalchemy.
Будьте особенно осторожны с управлением сеансами: https://factoryboy.readthedocs.io/en/latest/orms.html?highlight=sqlalchemy#managing-sessions

person John Moutafis    schedule 18.05.2018