Py.Test 测试可重用性最佳实践
Py.Test test reusability best practices
假设我正在 RESTful 服务器上测试用户交互过程。我的许多测试都要求我在我的数据库上有一个有效的用户,当然我想测试用户的创建。所以,在 py.test 我会写这样的东西:
def test_user_creation():
'''user creation goes here'''
def test_user_update_values():
'''should create an user and validate the new values'''
问题是,重用创建过程的最佳做法是什么?夹具?调用第一个测试用例并 return 用户调用第二个?或者为每个测试复制所有内容?如果您需要重构部分代码,迫使您修改所有测试,则尽管更孤立,但后来的替代方案可以是 PITA。
一切都取决于偏好,在这种情况下,我会说固定装置是您最好的选择。尽管您也可以使用参数化测试:
示例来自:https://pytest.org/latest/example/parametrize.html
from datetime import datetime, timedelta
testdata = [(datetime(2001, 12, 12), datetime(2001, 12, 11), timedelta(1)),
(datetime(2001, 12, 11), datetime(2001, 12, 12), timedelta(-1)),
]
@pytest.mark.parametrize("a,b,expected", testdata)
def test_timedistance_v0(a, b, expected):
diff = a - b
assert diff == expected
假设我正在 RESTful 服务器上测试用户交互过程。我的许多测试都要求我在我的数据库上有一个有效的用户,当然我想测试用户的创建。所以,在 py.test 我会写这样的东西:
def test_user_creation():
'''user creation goes here'''
def test_user_update_values():
'''should create an user and validate the new values'''
问题是,重用创建过程的最佳做法是什么?夹具?调用第一个测试用例并 return 用户调用第二个?或者为每个测试复制所有内容?如果您需要重构部分代码,迫使您修改所有测试,则尽管更孤立,但后来的替代方案可以是 PITA。
一切都取决于偏好,在这种情况下,我会说固定装置是您最好的选择。尽管您也可以使用参数化测试:
示例来自:https://pytest.org/latest/example/parametrize.html
from datetime import datetime, timedelta
testdata = [(datetime(2001, 12, 12), datetime(2001, 12, 11), timedelta(1)),
(datetime(2001, 12, 11), datetime(2001, 12, 12), timedelta(-1)),
]
@pytest.mark.parametrize("a,b,expected", testdata)
def test_timedistance_v0(a, b, expected):
diff = a - b
assert diff == expected