我希望更好地理解我应该测试具有许多子步或子功能的函数。
我们说我有功能
// Modify the state of class somehow
public void DoSomething(){
DoSomethingA();
DoSomethingB();
DoSomethingC();
}
这里的每个功能都是公开的。每个子功能有2个路径。因此,要测试DoSomething()
的每条路径,我都要进行2 * 2 * 2 = 8次测试。通过为DoSomething()
编写8个测试,我也将间接测试子函数。
那么我应该像这样进行测试,还是为每个子函数编写单元测试,然后只编写1个测试用例来测量DoSomething()
之后的类的最终状态并忽略所有可能的路径?共2 + 2 + 2 + 1 = 7次测试。但是,DoSomething()
测试用例是否依赖于其他单元测试用例才能完全覆盖?
答案 0 :(得分:3)
似乎有一种非常普遍的宗教认为测试应该是单元测试。虽然我不打算低估单元测试的实用性,但我想指出它只是一种可能的测试风格,其广泛(甚至是独占)的使用表明人们(或环境)有点不安全关于他们在做什么。
根据我的经验,对系统内部工作原理的了解有助于作为测试的提示,但不作为测试工具。因此,在大多数情况下,黑盒测试更有用,尽管这部分是因为我不会对我正在做的事情不安全。 (而这又是因为我广泛地使用断言 ,所以基本上我的所有代码都在不断地测试自己。)
在不知道您案例的具体情况的情况下,我会说,一般而言,DoSomething()
通过调用DoSomethingA()
然后调用DoSomethingB()
然后调用DoSomethingC()
来实现的事实是实现细节,你的黑盒测试最好不知道。所以,我肯定 不 测试DoSomething()
调用DoSomethingA()
,DoSomethingB()
和DoSomethingC()
,我只会测试以确保它返回正确的结果,并使用它所做的知识实际上调用这三个函数作为提示我将准确实现您计划使用的那7个测试。
另一方面,应该注意的是,如果DoSomethingA()
和DoSomethingB()
以及DoSomethingC()
也是公共函数,那么你应该 也可以单独测试它们。
答案 1 :(得分:1)
单独测试每个子功能(因为他们是公开的)。 如果弹出一个问题,它会帮助你找到问题。
如果DoSomething仅使用其他功能,我就不会为此编写额外的测试。如果它有其他逻辑,我会测试它,但假设所有函数都在正常工作(如果它们在不同的类中,嘲笑它们)。
重点是找到其他测试和测试中未涵盖的功能。
答案 2 :(得分:0)
应避免间接测试。您应该明确地为每个函数编写单元测试。之后你应该模拟子方法并测试你的主要功能。例如:
您有一个将用户插入数据库的方法,方法如下:
ComponentName componentName2 = new ComponentName("com.packagename",
"com.packagename.HideAppActivity");
context.getPackageManager().setComponentEnabledSetting(
componentName2,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
如果要测试InsertUser函数,则应该模拟外部/子/嵌套方法并测试InsertUser函数的行为。
这个例子创建了两个测试:1 - “当用户存在然后应该抛出异常”
2 - “当用户不存在时应该插入用户”