首页 > 解决方案 > 集成测试应该是独立的吗?

问题描述

我正在使用 Selenium 为 Web 应用程序编写集成测试。在过去的一个项目中,我创建了一个测试函数来测试应用程序的所有功能。Python 中使用 unittest 的示例:

class TestWebUI(unittest.Testcase)
    def test_app(self):
        login("admin")
        testListX()
        x = testCreateX()
        y = testCreateY(x)
        testUpdateX(x)
        testUpdateY(y)
        testDeleteX(x)
        testDeleteY(y)
        testCreateZ()

        login("user")
        testListX()
        testListY()
        testCreateZ()         

在这个之前的项目中,开发人员应该只在大型单体测试(及其子测试)通过时才提交补丁。可以肯定的是,当任何补丁在服务器中提交时,测试也会在服务器中运行。结果将显示在补丁审查工具中,只有通过所有测试才能批准补丁。这工作得很好。

我正在进行一个新项目,并考虑用较小的测试替换整体集成测试。但是,这将需要为每个测试添加设置代码(因此需要额外的执行时间)。例如,上面的测试代码会变成这样:

class TestWebUI(unittest.TestCase):
    def test_list_x(self):
        login("admin")
        (testListX() code here)

    def test_create_x(self):
        login("admin")
        (testCreateX() code here)

    def test_delete_x(self):
        login("admin")
        (create dummy x)
        (testDeleteX() code here)

    def test_create_y(self):
        login("admin")
        (create dummy x)
        (testCreateY(x) code here)

除了可以同时运行测试之外,后一种方法还有什么好处?将集成测试拆分为多个测试并为每个测试重复设置是否很常见?

本题提到了 Selenium、Python 和 unittest 等具体技术,但与它们无关。

标签: testingintegration-testing

解决方案


一般来说,将一个大测试分成几个小测试被认为是更好的做法,并且有几个好处。

首先,它使您在执行重大更改时更容易查看失败的原因。看到test_create_y失败比在失败时必须挖掘日志/错误消息test_app以了解 y 的创建被破坏要容易得多。

其次,拥有可以单独运行的较小测试可以加快开发周期。假设您破坏了 x 的创建 - 您想要修复它,并仅重新运行失败的测试 ( test_create_x) 以确保您的修复是好的,而不是运行整个(长)测试套件。最终,当您获得一个有效的修复程序时,您希望在合并之前提交它并使用它运行整个测试套件,但通常在您准备好修复程序之前不需要这样做。当然,如果您确实想为每次中间尝试运行整个套件,那么没有什么能阻止您。

第三,它允许您一次检测多个故障。一旦测试未通过断言,它就不会继续。假设您破坏了 x、y 和 z 的创建。使用单独的测试,您将有三个失败的测试,并且可以很容易地看到所有这三个功能都被破坏了。使用单体测试,您会看到 x 已损坏,修复它,然后重新运行测试,只看到 y 已损坏,然后对 z 重复相同的过程。

最后,您需要记住,这些是集成测试,而不是单元测试,并且您不必将测试分解为尽可能小的单元。如果您担心会导致执行时间更长的重复操作,您可以采用中间方法并将一些测试(即需要相同设置的测试)分组到一个测试方法中,例如:

class TestWebUI(unittest.Testcase)
    def test_x(self):
        login("admin")
        testListX()
        x = testCreateX()
        testUpdateX(x)
        testDeleteX(x)

    def test_y(self):
        # same concept as test_x...

推荐阅读