何时选择系统测试而不是集成测试Rails 5.1?

29

随着Rails 5.1的发布,他们包含了系统测试。这意味着我们可以在Rails中测试JavaScript。

我看到Rails指南解释了一个示例测试创建文章的两种方式:通过系统测试和集成测试。

现在问题是:在Rails 5.1之前,我在集成测试中编写复杂的测试用例。但现在我有两个选项来编写测试用例。

我可以像下面这样编写测试用例:

test: should create article

我可以在集成测试中编写相同的测试用例,但是我也可以在系统测试中编写。

那么什么情况下应该选择系统测试来编写测试用例?什么情况下应该选择集成测试?


7
集成测试不使用浏览器,因此您无法在其中测试 JavaScript。 - mikdiet
重点不在于选择最佳类型的测试(集成测试或系统测试),而是同时使用两种测试类型(集成和系统测试)通过在集成测试中测试行为和在系统测试中测试用户交互来测试。例如,如果您想测试用户点击时是否使用ajax加载了数据(一种交互),则选择系统测试。如果要测试返回数据是否符合您的预期,则选择集成测试。如果您不想同时测试交互和行为,则只需选择最适合您的那个测试类型即可。 - jbatista
2个回答

31
MikDiet已经给出了简单的回答。关于详细的答案,请查看系统测试和集成测试的文档

系统测试可在真实浏览器或无头驱动程序中运行测试,以测试应用程序的完整用户交互。

有一个快速判断的方法:所有与Javascript互动的测试必须作为系统测试运行。但您也可以使用它们来测试响应式布局,因为您可以指定浏览器的屏幕大小。

集成测试用于测试应用程序各个部分之间的交互。通常用于测试应用程序中重要的工作流程。

集成测试不同,因为它们不是通过浏览器运行的。它们仍然允许您与结果页面的HTML进行交互,但请记住,您使用的是静态输出。
在集成测试中,您主要关注控制器操作的行为,而不是用户所看到和交互的内容。本文档的这一部分可能会帮助您了解集成测试的全部内容:控制器的功能测试

那么系统测试是对功能测试的改进和替代? - Marklar
3
我不会这么说。系统测试在某种程度上相当于Minitest的等同于RSpec的功能规格说明。从高层次来看,它们基本上是相同的。从低层次来看,系统测试稍微容易一些,也许现在会比较快,因为它们与Rails紧密集成。但据我所知,RSpec计划使用系统测试的API来编写他们的功能规格说明,这将使它们完全相同,只是具有不同的语法。 - jdno

11

TL;DR: 如果我今天开始一个新的应用程序,我会使用系统测试而不是集成测试。集成测试唯一的优点是速度。

我认为系统测试比集成测试有两个显著的优点:

  • 它们测试与真实屏幕的交互,而不是模拟这些的人造请求。
  • 它们更加现实和全面。例如,一块儿意外捣乱的JavaScript将使规范失败,而在集成测试中将被忽略。

我认为集成测试的唯一好处是速度。确实,它们要快得多(可以查看我做的这个实验)。对我来说,速度差异并不是很大的问题,因为:

  • 我可以在我的计算机上运行隔离的系统测试,用时不到2秒。这足以快速反馈我的编码乐趣。
  • 我依赖云测试运行器进行大型套件的并行测试。

我认为今天本地和云端的速度和并行性都已足够好,并且随着时间的推移,这些只会变得更好。因此,如果你今天开始一个新的应用程序,我相信系统测试是一个更加安全的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接