【发布时间】:2016-03-03 23:41:41
【问题描述】:
这是一个普遍的问题,但知道我正在使用一个封装了 RPC 样式(远程过程调用)控制器的系统可能会有所帮助,这正是我正在测试的。它包含更改此控制器内部状态的公共方法。可以使用公共方法读取此控制器的状态。
这个类中的两个方法是:
-
CreateProgramSet(...),创建“程序集”(更改 RPC 控制器的内部状态)和 -
GetStatus(),检索此 RPC 控制器的状态,包括使用CreateProgramSet(...)创建的程序集。
为了测试GetStatus(),我使用一些硬编码参数调用CreateProgramSet(...)(用于设置),然后根据硬编码值测试GetStatus() 的结果。
为了测试CreateProgramSet(...),我的做法完全相同,只是在这种情况下GetStatus() 用于验证CreateProgramSet(...) 是否正确运行。
我在这个测试场景中看到的问题是,现在两个测试都耦合到这两个方法,所以如果GetStatus() 发生变化,两个测试都可能失败。如果CreateProgramSet(...) 更改,则两个测试都可能失败。但最重要的是,如果两种方法都以正确的方式改变(不知道彼此的改变),两种测试都可能因错误的原因通过。这显然是不受欢迎的情况。我从这个问题中看到的唯一方法是测试类的内部,但这在测试中是不受欢迎的。
我发现的大多数示例都处理返回值的方法,例如“添加”方法或不需要设置的极其简单的方法。实际上,许多类变得足够复杂,需要设置来测试类的各个部分。对于可以处于多个状态的类尤其如此。而如果一个类不存储状态,还不如让它成为一个静态类。此外,我发现大多数示例都是数据测试输出而不是状态变化。难道我做错了什么?对我来说,这个问题指向代码异味,但我似乎无法弄清楚我做错了什么。
这个问题与语言无关,但如果它有所作为,我正在使用 C# 和 NUnit。
【问题讨论】:
-
太久没有阅读:如果 2 个测试具有相同的前提条件,您可能可以配置您的测试框架,使其在执行测试之前执行前提条件。对于 JUnit,它是
@Before。 -
@Tunaki 这不是问题所要问的......它询问将两个公共方法耦合到同一个测试是否是不好的做法,即使其中一个方法未在测试中,但仅用于设置用于测试其他方法。
-
这就是为什么我说:“设置”是一个先决条件。因此,应该以专门用于设置的专用方法将其分开。并让测试框架在每次测试之前调用该设置方法。
-
无论如何,如果设置失败,测试仍然会因为错误的原因失败。
-
不:设置方法不是测试本身的一部分。如果设置失败,测试甚至不会运行。
标签: java c# unit-testing testing nunit