我有一个端到端的Selenium集成测试,它包含几个步骤,每个步骤设置一定的状态并将数据传递到下一步。
测试场景:
1. Create item.
2. Assign item to group.
3. Approve item.
...
4. Publish item.
这些步骤不是原子的,而是相互依赖的。测试类从unittest.TestCase
扩展而来,并包含一个test_xyz()
方法,该方法包装每个步骤的方法。
目前,最终报告仅包含包装器test_xyz()
方法的通过/失败状态。我希望将每个步骤视为“测试步骤”,并在测试报告中单独输入。
将所有步骤转换为test_step1()
,test_step2()
等然后执行执行顺序和数据交换是错误的,因为这些步骤不是自包含的测试。
有没有办法将某些方法标记为测试步骤,以便它们在测试报告中显示为单独的条目?
基本上,我想要的只是改进可视化报告,以便从报告中更明显地看出整个集成测试失败的步骤。这可以通过unittest
实现吗?组织代码以使其适合单元测试范例的最佳实践是什么?
不确定unittest
是集成测试的最佳工具,因为严格来说这不是单元测试。切换到像pytest这样的东西对于集成测试更有意义,同时还允许“免费”HTML报告生成吗? (我目前正在使用nose来运行测试并使用相应的nose plugin生成HTML报告。)
答案 0 :(得分:2)
pytest
最灵活的选项是使用pytest和@pytest.mark.incremental切换到pytest-html以生成HTML报告。
还计划将pytest-selenium plugin作为一种可能更清洁的方式来组织硒装置。
以下文章对于理解如何在测试步骤之间维护共享状态非常有用:http://computableverse.com/blog/pytest-sharing-class-fixtures
unittest
如果您更喜欢坚持unittest
,那么对于像迭代这样的简单用例,您可以使用unittest.subTest,如下例所示:
#!/usr/bin/env python3
import unittest
import requests
HOST='http://httpbin.org'
class TestEndpoints(unittest.TestCase):
def test_endpoints(self):
for endpoint in ('/headers',
'/ip',
'/user-agent',
'/response-headers',
'/html',
):
with self.subTest(path=endpoint):
url = HOST + endpoint
response = requests.get(url)
print(url, response.status_code)
self.assertEqual(response.status_code, requests.codes.ok, msg=f'expected status code {requests.codes.ok}')
if __name__ == '__main__':
unittest.main()