[英]Generating fixture data with Python's fixture module
我是第一次使用夾具模塊,試圖獲得更好的夾具數據,這樣我就可以使我們的功能測試更加完整。
我發現夾具模塊有點笨重,我希望有更好的方法來做我正在做的事情。 這是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
我想做的是編寫一個功能測試,只檢查合適的人可以訪問頁面。 (實際的權限更復雜,我只是想給你一個玩具示例。)
像這樣的東西:
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)
有沒有辦法生成燈具數據,所以我的開發人員不必記得每次添加角色時都要在燈具上添加一行? 我們將所有角色的規范列表作為應用程序中其他位置的配置,所以我有。
我沒有結合任何這個或夾具模塊,所以我很高興聽到建議!
一個選項是使用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)
在測試會話中創建100個Employee
對象。 session
訪問這些對象。 有關在SQLAlchemy中使用factory_boy的更多信息: https ://factoryboy.readthedocs.io/en/latest/orms.html?highlightlight = sqalchemy #sqlalchemy。
特別要注意會話管理: https : //factoryboy.readthedocs.io/en/latest/orms.html?highlight = sqlalchemy_managing-sessions
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.