ccp*_*zza 6 python integration-testing nose pytest python-unittest
我有一个端到端的 Selenium 集成测试,它由几个步骤组成,每个步骤设置特定状态并将数据传递到下一步。
测试场景:
1. Create item.
2. Assign item to group.
3. Approve item.
...
4. Publish item.
Run Code Online (Sandbox Code Playgroud)
这些步骤不是原子的,并且相互依赖。测试类扩展自unittest.TestCase并包含单个test_xyz()方法,该方法包装了每个步骤的方法。
目前,最终报告仅包括包装test_xyz()方法的通过/失败状态。我希望每个步骤都被视为一个“测试步骤”,并在测试报告中有一个单独的条目。
将所有步骤转换为test_step1(), test_step2()etc 然后强制执行执行顺序和数据交换感觉是错误的,因为这些步骤不是独立的测试。
有没有办法将某些方法标记为测试步骤,以便它们在测试报告中显示为单独的条目?
基本上,我想要的只是改进可视化报告,以便从报告中更明显地看出整个集成测试失败的步骤。这是可以实现的unittest吗?组织代码以使其适合单元测试范式的最佳实践是什么?
不确定unittest是集成测试的最佳工具,因为严格来说这不是单元测试。切换到像 pytest 这样的东西对集成测试更有意义,同时仍然允许“免费”的 HTML 报告生成?(我目前正在使用鼻子运行测试并使用相应的鼻子插件生成 HTML 报告。)
ccp*_*zza 10
pytest事实证明,最灵活的选择是使用@pytest.mark.incremental和pytest-html切换到pytest以生成 HTML 报告。
还计划研究pytest-selenium 插件作为组织 selenium 固定装置的一种可能更清洁的方式。
以下文章证明有助于理解如何在测试步骤之间维护共享状态: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()
Run Code Online (Sandbox Code Playgroud)