2016-05-04 98 views
0

我必须实现一种方法来测试应用程序的不同方法。我正在收集有关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只用于这样吗?我怎么能测试这个相同的方法在这个相同的数据的多个用途?

+2

我同意@Makoto的回答。如果您想要彻底,JUnit允许您使用多个输入数据组合运行测试 - 请参阅参数化测试[此处](http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test /)或[这里](https://ourcraft.wordpress.com/2008/08/27/writing-a-parameterized-junit-test/)。不过,这通常不是必需的。我不认为我曾经使用参数化测试(除了性能测试,但这是一个不同的故事)。 – Mifeet

回答

1

有,你应该牢记测试的几个原则:

  • 设置你测试了你想通过它来运行数据。 是在这个控制。
  • 您的代码应该足够健壮以处理任何有效和受支持的数据。明白任何出现的错误情况。
  • 测试所有情况。当代码进入边缘情况或意外情况时,仅测试快乐路径不会完成任何操作。

为了您getFullName()方法,我看到四个不同的情况下,是值得研究:

  • 当两个firstNamelastName不是空
  • firstName为null,并且lastName不为空
  • firstName不为空且lastName不为空
  • firstNamelastName如果支付这些案件则不应该的问题你抽到什么就实际的实时数据为空

;你已经测试了这种方法可能遇到的四种可能的状态,并且希望你能够做出明智的选择,围绕这些情况下的陌生人做些什么。

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