使用Specflow,我编写了一套模拟每月工资单的场景,验证每个月的计算付款,最后验证年底的数字。
每个月的结果是累积的,因此每个后续场景都依赖于前一个月的添加和扣除。支付计算通过第三方工具写入数据库,因此创建和销毁场景之间的测试数据是昂贵的。
根据我的测试经验,我知道确保测试的执行顺序并不总是可能的。我可以用一些场景命名约定控制执行顺序,但不能保证远程测试运行器将按字母顺序运行测试。
我考虑过的选项:
- 通过包含许多给定、何时、然后断言的单一场景运行一整年。这导致了一个难以阅读的巨大场景。
- 为每个场景创建一个连接"给定"。"给定:X月的所有款项已支付"。这会产生大量数据库流量,因为每个场景都需要创建和销毁测试数据。
是否有更好的方法来存储场景之间的状态,并确保场景按照期望的顺序执行?
依赖场景的执行顺序是一种反模式,应该避免。出于同样的原因,测试运行程序通常不提供任何机制来控制执行顺序。这也违背了可执行规范的概念:场景本身应该是可理解的(和可执行的)。
在你的例子中,Given部分应该为有问题的计算准备数据,When应该计算,Then应该检查单个计算的结果。
为了减少执行时间,也许你可以尝试选择"重要"的场景,以一种测试不同方面的方式。可能没有必要每个月1-11进行测试。您可以对第一个月的工资进行一次测试,对第二个月进行一次测试,对结束一整年进行一次测试,对开始新的一年进行一次测试,等等。
这也是一种常见的技术,即给定的不一定要以与"实际应用程序"相同的方式完成(从头开始)。有时您可以在测试中使用快捷方式,以更快更简单的方式确保先决条件。例如,你可以指定上个月的总和,如果这是你需要计算下个月的所有场景(而不是让应用程序从头开始计算一切)。当然,您必须知道自己在做什么,并且必须考虑到应用程序的某些方面存在的风险。