我的问题是:如果我有一个测试方法,那么让我们说一个代表一个人的对象的构造函数:
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 ...
}
或者我应该为每个对象创建一个测试套装,并为每个方法创建一个测试用例作为测试?但是,如果我想测试一个方法的几个参数怎么办?我应该为每个案例写一个测试用例吗?像:
答案 0 :(得分:0)
关于构造函数..如果有可能根据输入抛出异常,那么测试就可以了。
一般情况下,如果有任何逻辑认为重要,那么您应该选择单元测试这些代码部分。你必须要聪明,尽管没有测试太多,因为如果你获得超过60/70%的覆盖率,这意味着你已经测试了最重要的逻辑,那么你将达到最终的回报,因为测试更多将意味着更多浪费时间而不是实际利益。
关于以下方法:
名称太长的一个测试用例
一个名称太短的测试用例
包含数字等名称的测试用例?
这听起来不错,因为您希望测试覆盖方法中的一条逻辑路径......理想情况下不会再这样。如果您确实开始测试更多的东西,那么最终将会出现大量繁琐的测试用例,这些测试用例很难调试,理解和维护。
使用一个/两个公共方法的小班,以及一套专业测试将是理想的。
要记住的另一件事是,每个测试用例尽可能尝试参数化,以便为每个测试尽可能多地挤压。
我强烈建议使用像Junit Data Provider之类的项目来编写参数化案例。我已经使用它几年了,它使事情比构建的junit参数化更容易(如果你实际上说有任何参数化)。
答案 1 :(得分:0)
在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");
}
答案 2 :(得分:0)
针对“大”方法的测试类似于集成测试,其中可以模拟较小的方法。
如果您可以将“大”方法分为五个隔离的方法,那么“大”方法可以进一步划分为隔离方法在语义/上下文意义上的分组。
然后,您可以将较大的隔离方法分组模拟为“大”方法。
答案 3 :(得分:-1)
它是完美化的完美案例。创建一个测试并将所有条件作为参数对象传递。
参考:https://github.com/junit-team/junit4/wiki/parameterized-tests