JUnit如何测试多个函数

问题描述 投票:1回答:3

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

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

  • 一个名字的测试用例太长了
  • 一个测试用例名称太短
  • 包含数字的名称的一个测试用例等等?
java unit-testing testing junit
3个回答
0
投票

关于,构造函数..如果有可能根据输入抛出异常,那么测试就可以了。

一般来说,如果有任何逻辑认为重要,那么你应该选择单元测试那些代码部分。你必须要聪明,尽管没有测试太多,因为如果你获得超过60/70%的覆盖率,这意味着你已经测试了最重要的逻辑,那么你将达到最终的回报,因为测试更多将意味着更多浪费时间而不是实际利益。

关于以下方法:

一个名字的测试用例太长了

一个名称太短的测试用例

包含数字等名称的测试用例?

这听起来不错,因为您希望测试覆盖方法中的一条逻辑路径......理想情况下不会更多。如果您确实开始测试更多的东西,那么最终将会出现很多膨胀的测试用例,这些测试用例很难调试,理解和维护。

具有一个/两个公共方法的小班级和一套专业测试将是理想的。

还要记住的另一件事是,每个测试用例尽可能尝试对其进行参数化,以便为每个测试尽可能多地挤压它们。

我强烈建议使用像Junit Data Provider这样的项目来编写参数化案例。我已经使用它几年了,它使得事情比构建它的junit参数化更容易(如果你实际上说有任何)。


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");
 }

-1
投票

它是完美化的完美案例。创建一个测试并将所有条件作为参数对象传递。

参考:https://github.com/junit-team/junit4/wiki/parameterized-tests

© www.soinside.com 2019 - 2024. All rights reserved.