Rac*_*ers 6 python sqlalchemy nose flask
我是第一次使用夹具模块,试图获得更好的夹具数据,这样我就可以使我们的功能测试更加完整.
我发现夹具模块有点笨重,我希望有更好的方法来做我正在做的事情.这是Python 2.7中的Flask/SQLAlchemy应用程序,我们使用nose作为测试运行器.
所以我有一套员工.员工有角色.有几个页面具有相当复杂的权限,我想确保这些页面经过测试.
我创建了一个具有每种角色类型的DataSet(我们的应用程序中大约有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
Run Code Online (Sandbox Code Playgroud)
我想做的是编写一个功能测试,只检查合适的人可以访问页面.(实际的权限更复杂,我只是想给你一个玩具示例.)
像这样的东西:
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)
Run Code Online (Sandbox Code Playgroud)
有没有办法生成灯具数据,所以我的开发人员不必记得每次添加角色时都要在灯具上添加一行?我们将所有角色的规范列表作为应用程序中其他位置的配置,所以我有.
我没有结合任何这个或夹具模块,所以我很高兴听到建议!
一种选择是使用factory_boy来创建测试数据。
假设您保留并相应地更新了一个角色列表(稍后将使用),如下所示:
roles = [ROLE_ENGINEER, ROLE_ADMIN, ROLE_MANAGER, ...]
Run Code Online (Sandbox Code Playgroud)让我们为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)
Run Code Online (Sandbox Code Playgroud)
该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)
Run Code Online (Sandbox Code Playgroud)
分解:
EmployeeFactory.create_batch(size=100)Employee在测试会话中创建 100 个对象。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
| 归档时间: |
|
| 查看次数: |
3111 次 |
| 最近记录: |