这是一个普遍的问题,但它可能有助于我知道我正在使用一个封装RPC样式(远程过程调用)控制器的系统,这正是我正在测试的。它包含更改此控制器内部状态的公共方法。可以使用公共方法读取此控制器的状态。
本课程中的两个方法是:
CreateProgramSet(...)
,它创建一组“程序”(更改RPC控制器的内部状态)和GetStatus()
,它检索此RPC控制器的状态,包括使用CreateProgramSet(...)
创建的程序集。 要测试GetStatus()
,我正在使用一些硬编码参数调用CreateProgramSet(...)
(用于设置),然后针对硬编码值测试GetStatus()
的结果。
要测试CreateProgramSet(...)
,我做的完全相同,除非在这种情况下GetStatus()
用于验证CreateProgramSet(...)
是否正确行事。
我在此测试场景中看到的问题是,现在两个测试都耦合到两个方法,因此如果GetStatus()
发生更改,则两个测试都可能失败。如果CreateProgramSet(...)
发生更改,则两个测试都可能失败。但最重要的是,如果两种方法都改变了正确的方式(不知道彼此的变化),两种测试都可能因错误的原因而通过。这显然是一种不受欢迎的情况。我看到这个问题的唯一方法是测试类的内部,但这在测试中是不受欢迎的。
我发现的大多数示例都涉及返回值的方法,例如“add”方法或非常简单的不需要设置的方法。实际上,许多类变得足够复杂,需要一个设置来测试类的各个部分。对于可以处于多个状态的类尤其如此。如果一个类不存储状态,也可以使它成为一个静态类。此外,我发现大多数例子都是测试数据输出而不是状态变化。难道我做错了什么?这个问题对我来说是一个代码味道,但我似乎无法弄清楚我做错了什么。
这个问题意味着与语言无关,但如果它有所不同,我正在使用C#和NUnit。
答案 0 :(得分:1)
单元测试与测试方法无关,而与测试方案有关。
你拿一个单位,设置它,然后检查它是否按预期运行。不要过多地考虑方法:它不是程序编程,而是OOP - 你应该测试你的单元是否通过最可能的用例场景,一些角落情况,仅此而已。
P.S。如果你所描述的是一个不好的做法,那么就不能测试任何有状态的类:你总是用一些方法调用来设置它,并用一些其他的方法调用进行验证,这意味着有缺陷的方法的幸运(或不幸)组合有时可能导致一个正确的结果(但这种情况多久发生一次?)。