与单元测试不同,功能测试通常不能自然隔离,因为每个测试通常需要前一个测试执行后的状态。
例如,要测试基本的 CRUD 操作,如实体删除或更新,必须首先创建它。虽然我们可以通过将实体创建代码提取到单独的方法中来防止代码重复,但尚不清楚如何处理调用实体创建测试或任何其他依赖测试的重复。随着测试数量的增加,这些重复调用会显着降低执行时间和可读性。
一个直观的解决方案是将所有这些相互依赖的测试合并到一个测试中,但这会使定位错误变得更加困难。
到目前为止,我所阅读的信息主要是关于单元测试的,我认为它并不完全符合功能/验收的需求,尤其是网络浏览器测试。
具体来说,目前我正在使用 JUnit 测试通过 Selenium WebDriver API 与内存数据库的 webapp 交互。
有些人会推荐什么最佳实践来解决这个问题?
最佳答案
理想情况下,您的 AUT 将提供在不使用 UI 的情况下创建数据的能力。 Web 服务会很棒,但您可以直接注入(inject)数据库(如果可能的话)。
然后,测试设置将通过此“后门”创建所需状态的数据。
这样做的好处是;
- 测试是孤立的,如果有问题则只有一个区域
- 即使输入数据的 UI 损坏,依赖数据的测试仍然可以运行
构建器模式可用于抽象您的数据创建(http://www.natpryce.com/articles/000714.html ).这将使您的测试设置真正具有表现力,并且对于您尝试创建和测试的场景而言是显而易见的。
显然,您可能希望端到端测试通过 UI 证明操作之间的集成,但这可以限制在一小部分,然后使用数据创建处理任何复杂场景或组合测试。
关于testing - 如何处理功能测试中的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24926710/