我的问题是:如果我有一个方法来测试,让我们说一个代表一个人的对象的构造函数: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%的覆盖率,这意味着你已经测试了最重要的逻辑,那么你将达到最终的回报,因为测试更多将意味着更多浪费时间而不是实际利益。
关于以下方法:
一个名字的测试用例太长了
一个名称太短的测试用例
包含数字等名称的测试用例?
这听起来不错,因为您希望测试覆盖方法中的一条逻辑路径......理想情况下不会更多。如果您确实开始测试更多的东西,那么最终将会出现很多膨胀的测试用例,这些测试用例很难调试,理解和维护。
具有一个/两个公共方法的小班级和一套专业测试将是理想的。
还要记住的另一件事是,每个测试用例尽可能尝试对其进行参数化,以便为每个测试尽可能多地挤压它们。
我强烈建议使用像Junit Data Provider这样的项目来编写参数化案例。我已经使用它几年了,它使得事情比构建它的junit参数化更容易(如果你实际上说有任何)。
有一个很好的工具来测试JUnit中的异常:
@Rule
public ExpectedException thrown= ExpectedException.none();
@Test
public void throwsExceptionWithSpecificType() {
thrown.expect(myException.class);
thrown.expectMessage("Name not valid");
new Person("name to looooooooooooooong");
}
它是完美化的完美案例。创建一个测试并将所有条件作为参数对象传递。
参考:https://github.com/junit-team/junit4/wiki/parameterized-tests