使用 Python unittest 进行集成测试:如何提高粒度?

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.incrementalpytest-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)