繁体   English   中英

单元测试 Java

[英]Unit Testing Java

我是 JUnit 测试的新手。

例如,我在一个项目中有一个 Misc 类:

public class Misc{

   public static int computeValue(int x,int y,int z)
   {
      int value = 0;

      if((x==y)||(z==0))
          value = x+2;

      else if(x>y)
          value = y+4;

      else 
          value = z;

      return value;
  }
}

我在 JUnit 类中尝试了它,但我不太确定我是否正确完成了它。

public class MiscTest {

@Test
public void testXEqualToY() {

    //Only X is equal to Y and z is not zero
    int x = 5,y=5;
    int value = 0;
    value = Misc.computeValue(5, 5, 10);
    assertEquals("test error",x,y,value);
}

@Test
public void testZEqualZero(){
    //Only z is 0
    int x=4,y=8,z=0;

    int value = 0;
    value = Misc.computeValue(11,5,0);
    assertEquals("test error",z,value);

}

我应该在测试用例方法中放入什么来测试值?


您设计测试的方式需要修改。 您需要考虑要验证的所有情况。 对于每种情况,您必须定义预期值并将其与函数的结果进行比较。
例如,我会考虑 4 个案例进行测试:
- x == y
- z == 0
- x > y
- x < y
我会这样写

@Test
public void testXEqualToY() {
  //Only X is equal to Y and z is not zero
  int x = 5,y=5;
  int z=0;
  int ref = 7;
  assertEquals(ref, Misc.computeValue(x, y, z));
}

@Test
public void testYEqualToZ(){
  //Only z is 0
  int x=4,y=8,z=0;
  int ref = 6;
  assertEquals(ref, Misc.computeValue(x, y, z));
}
Etc...

也就是说,应该在编写代码之前定义要测试的案例,以确保您的测试正在验证您想要实现的目标而不是您刚刚编写的内容。

问候,洛伊克。

这将是Parameterized 的一个很好的用途。 当您想为一堆不同的输入情况指定预期结果时, Parameterized真的很棒。 这里你只需要一个@Test ,并且可以通过简单的添加{ 0, 0, 0, 2 },来添加一个新的测试条件{ 0, 0, 0, 2 },

现在测试每个案例:

  • 当 x=y 时,期望 X+2
  • 当 z=0 时,期望 x+2
  • 当 x > y 时,期望 y+4
  • 否则,期望 z

这是基本结构

 @RunWith(Parameterized.class)
class MyTest{

    @Parameters
    public static Collection<Object[]> data() {
            return Arrays.asList(new Object[][] {
                            { { 0, 0, 0, 2 },... });
    }


     int x,y,z, expectedResult;

   // add constructor here

   @Test
   public void testYEqualToZ(){
      int actualResult = Misc.computeValue(x,y,z);
      assertEquals(actualResult, expectedResult);
     }
}

然后使用以下测试用例:

  • 1, 1, 5, 3 // xy 相等大小写
  • 2, 2, 8, 4 // 再次
  • 3, 6, 0, 5 // z 为 0 case
  • 3, 2, 8, 6 // x > y 情况
  • 3, 4, 8, 8 // x < y 情况

继续添加案例,直到您测试了所有可能的案例

您必须测试所有可能的执行流程(使用覆盖工具进行验证)。 使用参数化测试最容易。 java中有很多这样的框架。 为您的情况选择具有最佳比率功率/简单性的一种。 例如:

import static org.assertj.core.api.Assertions.assertThat;
import org.junit.runner.RunWith;
import com.googlecode.zohhak.api.TestWith;
import com.googlecode.zohhak.api.runners.ZohhakRunner;

@RunWith(ZohhakRunner.class)
public class MyTest {

    @TestWith({
        "5,5,0,     7",
        "4,8,0,     6",
        "11,5,0,    13"
    })
    public void should_be_valid_point(int x, int y, int z, int expected) {
        assertThat(Misc.computeValue(x, y, z)).isEqualTo(expected);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM