JUnit如何测试多个函数

时间:2017-03-15 11:33:47

标签: java unit-testing testing junit

我的问题是:如果我有一个测试方法,那么让我们说一个代表一个人的对象的构造函数: 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 ...
}

或者我应该为每个对象创建一个测试套装,并为每个方法创建一个测试用例作为测试?但是,如果我想测试一个方法的几个参数怎么办?我应该为每个案例写一个测试用例吗?像:

  • 一个名称太长的测试用例
  • 一个名称太短的测试用例
  • 包含数字的名称的一个测试用例 等等?

4 个答案:

答案 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