在复杂环境中进行JUnit测试

时间:2016-05-04 15:40:12

标签: java junit

我必须实现一种方法来测试应用程序的不同方法。我正在收集有关JUnit的信息,因为它是正确测试应用程序方法的最有名的方法,但我有很多问题,我需要一些我找不到的答案。

所以我有以下JUnit测试,我更容易想到:

public class Civilian {
    private final String firstName;
    private final String lastName;
    private final int birthDate; 

    public Civilian(String firstName, String lastName, int year) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.birthDate = year;
    }

    public String getFullName() {
        return firstName + " " + lastName;
    }
}

测试类:

public class CivilianTest {

    @Test
    public void getFullNameTest() {
        Civilian civ =  new Civilian("bob", "Reynolds",1997);

        Assert.assertEquals("bob Reynolds", civ.getFullName());
    }
}

在这个例子中,我必须知道getFullName方法的结果,以便在assertEquals()方法中对它进行比较。但是这种测试怎么能保证这种方法在任何情况下都能起作用呢?

在我必须处理的应用程序中,他们使用来自不同数据库的大量数据,这些数据将通过该方法进行修改并返回修改后的数据。

问题是在我使用该方法之前很难知道这些数据的结果。 JUnit只是这样使用的吗?如何在同一数据上测试同一方法的多种用途?

1 个答案:

答案 0 :(得分:1)

您应该记住一些测试原则:

  • 使用您要通过它运行的数据设置您的测试。 控制着这一点。
  • 您的代码应该足够强大,可以处理任何有效且受支持的数据。对于出现的任何错误案例都要明智。
  • 测试所有案例。当代码进入边缘案例或意外情况时,仅测试happy路径就不会成功。

对于getFullName()方法,我看到了四个值得研究的不同案例:

  • firstNamelastName都不为空时
  • firstName为空且lastName不为空时
  • firstName不为空且lastName不为空时
  • firstNamelastName都为空时

如果你涵盖了这些案例,那么它无关紧要你输入的实际实时数据是什么;你已经测试了这种方法可能遇到的四种可能状态,并希望你能对这些情况的陌生人做些明智的选择。

主要的是你可能将单元测试与端到端测试混为一谈,其中一个只查看小单元并确保它表现良好,而另一个查看整个应用程序(仍然使用模拟数据,但仍有大量数据),并确保它作为一个有凝聚力的单位行事。请记住:您在此处测试代码的单元,而不是通过此方法测试整个系统。