testing - 集成测试应该是独立的吗?
问题描述
我正在使用 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 等具体技术,但与它们无关。
解决方案
一般来说,将一个大测试分成几个小测试被认为是更好的做法,并且有几个好处。
首先,它使您在执行重大更改时更容易查看失败的原因。看到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...
推荐阅读
- c# - 你怎么知道在 Windows server 2008R2 上用于 TLS 1.2 的密码版本
- reactjs - WebSocket 连接到 'wss://localhost:3000/sockjs-node' 失败:
- javascript - Angular:应用模板样式后执行代码
- html - 有没有办法将网格边框作为整个网格大小的一部分?
- amazon-web-services - AWS S3 将内容作为附件发送
- react-native - React-Native Redux 无法设置状态
- javascript - 如何通过 Angular 服务中的 Firebase 订阅后台消息(Typescript 文件)
- ruby-on-rails - 使用 rspec 在 Ruby 上测试 Rails - 由于加载 rspec 时 TRUNCATE 表需要很长时间
- google-kubernetes-engine - 新的 GKE 集群记录数千个错误
- ios - 在swift4中点击文本字段时无法查看