使用JUnit测试类的最佳实践是什么

时间:2018-11-16 22:54:58

标签: java junit

我是Java的新手,最近我了解到JUnit是测试类的好工具。

我建立了一个名为Person的课程:

public Person {
    private String personName;
    private String personID;

    public Person(String personName, String personID){
            this.personName = personName;
            this.personID = personID;
    }

    /* Getters and setters */
}

然后我建立了一个类,该类接收一个充满人员的.bat文件,其信​​息如下:

1, Carl 
2, Jonh
...

我正在逐行读取该文件并创建实例:

public Person importPerson(String line) {
    String[] splitPersons = line.split(", ");
    int personID = Integer.valueOf(splitPersons[0]);
    String personName = splitPerson[1];
    Person newPerson = new Person(personID, personName);
    return newPerson;
}

现在,我想使用JUnit测试我的importPerson。我为此建立了一种方法,但不确定该测试是否进行了所有必要的验证。

我应该对代码进行哪些更改以优化验证?

@Test
public void testImportPerson() {
    String line = "1, Carl";
    Person test = personsGestor.importPerson(line);
    assertEquals("Error inserting ID", 1, test.getPersonID());
    assertEquals("Error inserting Name", "Carl", test.getPersonName());
}

谢谢。

3 个答案:

答案 0 :(得分:1)

您的测试是一条快乐的道路测试。尝试添加一些负面测试。例如,如果行无法按照您的方法预期的方式进行解析,该怎么办?如果它没有ID等,该怎么办?

答案 1 :(得分:1)

我建议对以下条件进行单元测试:

  • 空行
  • 仅用逗号分隔
  • 仅使用> 1个逗号
  • 具有1个整数值的行
  • 具有1个非整数值的行
  • 具有> 2个值的行
  • 带有2个值的行,其中第一个值不是整数

答案 2 :(得分:0)

您到底要测试什么?

如果您查看该Person类,那么我很难进行测试:它仅具有getter和setter(包括构造函数),而没有真正的逻辑/行为。我将测试重点放在行为上。当然,您也可以弄乱设置方法和获取方法,因此,如果您愿意,可以添加一个测试。

importPerson类具有更多功能。那是生产代码的一部分吗?然后一定要为它编写测试。我会尝试快乐的路径(就像您已经做过的那样),以及各种错误条件:没有名字,没有姓氏,没有逗号,带逗号的名字(如果有意义),无效的文件(权限被拒绝)。

如果importPerson是测试设置的一部分,那么您的测试太复杂了---它比被测试的代码要复杂得多!删除外部文件。在单元测试中拥有外部依赖项(例如文件系统,网络或数据库)总是很糟糕的,您通常会mock使用它们,以使测试更加可靠且不那么脆弱。

也就是说,您应该研究test-driven development,它将指导开发人员进行测试,并自动提出应该测试什么的问题。