我的问题是:如果我有一个方法来测试,让我们说一个代表一个人的对象的构造函数:
public void Person(String name){this.name = name;}
,创建一个这样的测试用例是不是很愚蠢:
public class PersonTest {
@Test
public void testPerson() throws myException{
// First thing I want to test
try {
new Person("name to looooooooooooooong");
fail("This test was supposed to throw an exception: name too long");
} catch (Exception e) {
if (e instanceof myException)
assertEquals("MSG: name not valid!", "Name not valid", e.getMessage());
}
//Second thing I want to test
try {
new Person("name to short");
fail("This test was supposed to throw an exception: name too short");
} catch (Exception e) {
if (e instanceof myException)
assertEquals("MSG: name not valid!", "Name not valid", e.getMessage());
}
//Oter things I want to test ...
}
或者我应该为每个对象创建一个测试套件,为每个要测试的方法创建一个测试用例吗?但是如果我想测试一个方法的多个参数怎么办?我应该为每个案例编写一个测试用例吗?喜欢:
- 一个名字太长的测试用例
- 一个名称太短的测试用例
- 一个名称包含数字的测试用例 等等?
最佳答案
关于构造函数.. 如果有可能根据输入抛出异常,那么对其进行测试就可以了。
一般来说,如果有任何逻辑被认为很重要,那么您应该选择对这些代码部分进行单元测试。你必须聪明,但不要测试太多,因为在某个时候,如果覆盖率超过 60/70%,这意味着你已经测试了最重要的逻辑,你将达到 yield 递减的地步,因为测试更多意味着更多浪费时间而不是实际 yield 。
关于 :
one test case for a name too long
one test case for name too short one
test case for name containing numbers and so on ?
这听起来不错,因为您希望测试覆盖方法中的一个逻辑路径……最好不要再覆盖更多。如果您确实开始测试更多的东西,那么您最终会得到很多臃肿的测试用例,这将难以调试、理解和维护。
具有一个/两个公共(public)方法和一套专门测试的小类将是理想的。
还有一件事要记住,如果可能,请尝试对每个测试用例进行参数化,这样您就可以为每个测试挤出尽可能多的可能性。
我强烈建议使用这样的项目:Junit Data Provider编写您的参数化案例。我已经使用它几年了,它比内置的 junit 参数化(如果你真的说有的话)让事情变得容易得多。
关于java - JUnit如何测试多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42808573/