单元测试:在测试另一种方法时调用公共方法(用于设置)是不好的做法吗?

时间:2016-03-03 23:41:42

标签: java c# unit-testing testing nunit

这是一个普遍的问题,但它可能有助于我知道我正在使用一个封装RPC样式(远程过程调用)控制器的系统,这正是我正在测试的。它包含更改此控制器内部状态的公共方法。可以使用公共方法读取此控制器的状态。

本课程中的两个方法是:

  • CreateProgramSet(...),它创建一组“程序”(更改RPC控制器的内部状态)和
  • GetStatus(),它检索此RPC控制器的状态,包括使用CreateProgramSet(...)创建的程序集。

要测试GetStatus(),我正在使用一些硬编码参数调用CreateProgramSet(...)(用于设置),然后针对硬编码值测试GetStatus()的结果。

要测试CreateProgramSet(...),我做的完全相同,除非在这种情况下GetStatus()用于验证CreateProgramSet(...)是否正确行事。

我在此测试场景中看到的问题是,现在两个测试都耦合到两个方法,因此如果GetStatus()发生更改,则两个测试都可能失败。如果CreateProgramSet(...)发生更改,则两个测试都可能失败。但最重要的是,如果两种方法都改变了正确的方式(不知道彼此的变化),两种测试都可能因错误的原因而通过。这显然是一种不受欢迎的情况。我看到这个问题的唯一方法是测试类的内部,但这在测试中是不受欢迎的。

我发现的大多数示例都涉及返回值的方法,例如“add”方法或非常简单的不需要设置的方法。实际上,许多类变得足够复杂,需要一个设置来测试类的各个部分。对于可以处于多个状态的类尤其如此。如果一个类不存储状态,也可以使它成为一个静态类。此外,我发现大多数例子都是测试数据输出而不是状态变化。难道我做错了什么?这个问题对我来说是一个代码味道,但我似乎无法弄清楚我做错了什么。

这个问题意味着与语言无关,但如果它有所不同,我正在使用C#和NUnit。

1 个答案:

答案 0 :(得分:1)

单元测试与测试方法无关,而与测试方案有关。

你拿一个单位,设置它,然后检查它是否按预期运行。不要过多地考虑方法:它不是程序编程,而是OOP - 你应该测试你的单元是否通过最可能的用例场景,一些角落情况,仅此而已。

P.S。如果你所描述的是一个不好的做法,那么就不能测试任何有状态的类:你总是用一些方法调用来设置它,并用一些其他的方法调用进行验证,这意味着有缺陷的方法的幸运(或不幸)组合有时可能导致一个正确的结果(但这种情况多久发生一次?)。