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

时间:2017-06-25 21:32:58

标签: python integration-testing pytest python-unittest nose

我有一个端到端的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报告。)

1 个答案:

答案 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()