在编写单元测试时,我遇到了一个非常有趣的问题。
我可以在测试代码中使用该功能时测试一个功能吗?
例如,
如果我有一个List<int>
类,其中有一个名为Add()
的函数。
我想测试一个目标列表对象,其中包含两个int:1和2。 现在我添加第三个数字:3,并希望断言数字已成功添加。所以我写道:
public void TestMethod()
{
//initialize
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
//do operation
list.Add(3);
Assert.IsTrue(list.Contains(3));
}
但是,上面的测试用例,试图测试目标函数:Add(),已经使用Add()进行初始化。我认为这种核心关系可能会在某些条件下导致某些问题,一般来说......
有没有测试理论说我们不能这样做?
谢谢!
答案 0 :(得分:4)
功能可能需要多个测试。在这种情况下,您将拥有一个仅测试一个Add()
的函数,然后测试您上面的函数。只要两者都通过,您就可以(合理地)确信您的结果是可靠的。但是,如果第一次测试失败,则应该忽略第二次测试的结果。
但理想情况下,您可以访问正在测试的内部状态,因此可以提供一种不同方式来设置不涉及调用被测函数的初始条件。
答案 1 :(得分:2)
在这种情况下,最好让测试更全面。我可能会这样做:
public void TestMethod()
{
//initialize
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
// Test setup
Assert.IsTrue(List.Count == 2);
Assert.IsTrue(List[0] == 1);
Assert.IsTrue(List[1] == 2);
//do operation
list.Add(3);
Assert.IsTrue(List.Count == 3);
Assert.IsTrue(List[0] == 1);
Assert.IsTrue(List[1] == 2);
Assert.IsTrue(List[2] == 3);
}
答案 2 :(得分:0)
没有什么可以阻止你这样做,但是在这个特定的例子中我没有看到这样做的价值。
还有其他可能有效的情况,例如:您想要测试特定行为的位置:
1)根据传递的参数值,第3次调用将影响对象位的状态与以前的不同。
2)第三次使用相同的方法时,您会遇到一些特殊行为,例如3次无效登录尝试。
答案 3 :(得分:0)
我认为编写类似于示例中的测试方法并不罕见。重要的是我们看待它的方式。
如果我们对TestMethod()的意图是测试Add(),我们不应该使用Add()在测试中建立前提条件。
如果我们对TestMethod()的意图是测试Add()和Contain()的交互/序列,那就应该没问题。