将两个jUnit测试用例合并为一个

时间:2017-09-28 17:03:44

标签: java eclipse junit junit4 testcase

我有以下两个junit测试用例:

@Test(expected=NullPointerException.class,timeout=2000)
public void X1()
{
    abc.xyz(null);
    fail("Car xyz() should throw NullPointerException when adding null items");
}

@Test(expected=NullPointerException.class,timeout=2000)
public void Y1()
{
    abc.pqr(null);
    fail("Car pqr() should throw NullPointerException when adding null items");
}

我想将上述两个测试用例合并为一个。我应该怎么做呢?

3 个答案:

答案 0 :(得分:2)

真的不希望将这些案例合二为一。他们正在测试完全不同的东西

在第一次测试中,您使用xyz测试null的结果。在您的第二个中,您使用pqr重新测试null。如果要检查这些测试的边界条件,这两个测试都可以编写和使用。

如果任一方法的行为发生更改,则在此方案中,您只需重写一个测试。也就是说,如果pqr突然变为零容忍,并且你在一次测试中将它们联系在一起,那么由于xyz不是空的,你仍然会因测试而失败 - 宽容。

将这些分开。您既不想也不需要将这些测试用例组合在一起。

答案 1 :(得分:2)

使用属性expected是一个非常弱的解决方案,因为您无法控制该方法的哪条指令将引发异常。

即使我不理解加入他们的原因......这里有一些解决方案:

JUNIT4

@Test
public void xyzAndPqr(){

  try {
    abc.pqr(null);
    fail("pqr does not throw NullPointerException");
  } catch(NullPointerException npe) {};

  try {
    abc.xyz(null);
    fail("xyz does not throw NullPointerException");
  } catch(NullPointerException npe) {};

}

注意:catch只接受NullPointerException,因此如果方法抛出其他类型的异常,则测试正确失败

注1:在catch子句中,您可以检查其他条件(消息,原因等)

注意2:如果没有检查剩余的,第一种不正确的方法测试失败。要始终检查所有方法,您可以使用收集器规则。

<强> JUNIT5

import static org.junit.jupiter.api.Assertions.*;
@Test
public void xyzAndPqr(){
   assertThrows(NullPointerException.class, () -> abc.pqr(null));
   assertThrows(NullPointerException.class, () -> abc.xyz(null));
}

注意:在需要检查其他条件(消息,原因等)的情况下,assertThrows返回有效的凸起Throwable

注1:在没有检查剩余的情况下,测试在第一个不正确的方法中失败。要始终检查所有方法,可以使用AssertAll。

import static org.junit.jupiter.api.Assertions.*;
@Test
public void xyzAndPqr(){
  AssertAll(
   () -> assertThrows(NullPointerException.class, () -> abc.pqr(null)),
   () -> assertThrows(NullPointerException.class, () -> abc.xyz(null))
  );
}   

使用AssertJ的JUNIT(4和5) (见http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion

import static org.assertj.core.api.Assertions.*;
@Test
public void xyzAndPqr(){
   assertThatNullPointerException().isThrownBy( () -> abc.pqr(null) );
   assertThatNullPointerException().isThrownBy( () -> abc.xyz(null) );
}

注意:您可以在assertJ中使用流畅的语法:例如添加.withMessage(&#34; ...&#34;)

注1:在没有检查剩余的情况下,测试在第一个不正确的方法中失败。要检查所有方法,可以使用AssertAll(如果在JUnit5中)或断言软断言(在两种情况下)

答案 2 :(得分:0)

同意Makoto认为这样做非常差,并且违反了任何一种最佳做法。同样值得怀疑的是,为什么你的组织会关心单元测试的低水平实施...无论如何......

@Test
public void xyzAndPqr(){

Throwable thrown;
try{
   abc.pqr(null);
catch(Throwable e){
   thrown = e;
}

  //assert thrown
assertThat(thrown,instanceOf(NullPointerException.class));
//assert anything else, null var or create another...
thrown = null;

try{
    abc.xyz(null);
catch(Throwable e){
   thrown = e;
}

assertThat(thrown,instanceOf(NullPointerException.class));
//assert anything else

如果需要,在它们的公共库中还有一些Apache ExceptionUtils可以获取消息等。

如果您使用的是Java8,那么AssertJ库可以处理这个更清晰的问题,

http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion

  assertThatNullPointerException().isThrownBy(() -> {   abc.pqr(null); })
  assertThatNullPointerException().isThrownBy(() -> {   abc.xyz(null); })