如何编写单元测试?

时间:2012-01-05 23:41:16

标签: java unit-testing

我有一个Java类。我怎么能unit test呢?


在我的情况下,我有一个二进制总和。它需要两个byte[]数组,对它们求和,并返回一个新的二进制数组。

5 个答案:

答案 0 :(得分:120)

  1. 使用正确的输入定义正常情况下的预期和期望输出。

  2. 现在,通过声明一个类来实现测试,将它命名为任何东西(通常类似于TestAddingModule),并将testAdd方法添加到它(例如下面的那个):

    • 编写方法,在其上方添加@Test注释。
    • 在方法中,运行二进制和assertEquals(expectedVal,calculatedVal)
    • 通过运行方法测试您的方法(在Eclipse中,右键单击,选择Run as→JUnit test)。

      //for normal addition 
      @Test
      public void testAdd1Plus1() 
      {
          int x  = 1 ; int y = 1;
          assertEquals(2, myClass.add(x,y));
      }
      
  3. 根据需要添加其他案例。

    • 如果存在整数溢出,请测试二进制和不会引发意外异常。
    • 测试您的方法是否正常处理Null输入(下面的示例)。

      //if you are using 0 as default for null, make sure your class works in that case.
      @Test
      public void testAdd1Plus1() 
      {
          int y = 1;
          assertEquals(0, myClass.add(null,y));
      }
      

答案 1 :(得分:80)

要为您的项目进行单元测试,请按照以下步骤操作(我使用Eclipse编写此测试):

1-点击新建 - > Java项目。

Create Project

2-记下你的项目名称,然后点击完成。

Create Project

3-右键单击您的项目。然后,点击新建 - >类。

Create Class

4-记下您的班级名称,然后点击完成。

Create Class

然后,完成这样的课程:

public class Math {
    int a, b;
    Math(int a, int b) {
        this.a = a;
        this.b = b;
    }
    public int add() {
        return a + b;
    }
}

5-点击文件 - >新 - > JUnit测试用例。

Create JUnite Test

6-检查setUp()并单击完成。 SetUp()将是您初始化测试的地方。

Check SetUp()

7-点击OK。

Add JUnit

8-在这里,我只添加7和10.所以,我希望答案是17.完成你的测试类:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class MathTest {
    Math math;
    @Before
    public void setUp() throws Exception {
        math = new Math(7, 10);
    }
    @Test
    public void testAdd() {
        Assert.assertEquals(17, math.add());
    }
}

9-在package explorer中单击您的测试类,然后单击Run as - > JUnit测试。

Run JUnit Test

10-这是测试的结果。

Result of The Test

我希望它有所帮助。

答案 2 :(得分:16)

这是一个非常通用的问题,有很多方法可以解答。

如果要使用JUnit创建测试,则需要创建测试用例类,然后创建单独的测试方法,测试测试中类/模块的特定功能(单个测试用例类通常与单个“生产”相关联“正在测试的类”并且在这些方法中执行各种操作并将结果与​​正确的结果进行比较。尝试覆盖尽可能多的角落情况尤为重要。

在您的具体示例中,您可以测试以下内容:

  1. 两个正数之间的简单加法。添加它们,然后验证结果是否符合预期。
  2. 正数和负数之间的加法(返回带有第一个参数符号的结果)。
  3. 正数和负数之间的加法(返回带有第二个参数符号的结果)。
  4. 两个负数之间的加法。
  5. 导致溢出的添加。
  6. 要验证结果,可以使用org.junit.Assert类中的各种assertXXX方法(为方便起见,您可以执行'import static org.junit.Assert。*')。这些方法测试特定条件,如果不验证(使用特定消息,可选),则测试失败。

    您的案例中的示例测试用例类(未定义方法内容):

    import static org.junit.Assert.*;
    
    public class AdditionTests {
        @Test
        public void testSimpleAddition() { ... }
    
    
        @Test
        public void testPositiveNegativeAddition() { ... }
    
    
        @Test
        public void testNegativePositiveAddition() { ... }
    
    
        @Test
        public void testNegativeAddition() { ... }
    
    
        @Test
        public void testOverflow() { ... }
    }
    

    如果您不习惯编写单元测试,而是通过编写特殊测试来测试代码,然后“直观地”验证(例如,您编写一个简单的主方法,接受使用键盘输入的参数然后打印结果 - 然后你继续输入值并在结果正确的情况下验证自己),然后你可以从上面的格式编写这样的测试并用正确的assertXXX方法验证结果,而不是手动完成。这样,如果必须进行手动测试,则可以更轻松地重新运行测试。

答案 3 :(得分:7)

如同提到的@CoolBeans一样,请查看jUnit。这里有一个简短的tutorial,可以帮助您开始使用jUnit 4.x

最后,如果您真的想了解有关测试和测试驱动开发(TDD)的更多信息,我建议您查看Kent Beck的以下书籍:Test-Driven Development By Example

答案 4 :(得分:1)

其他答案还向您展示了如何使用JUnit设置测试类。 JUnit不是唯一的Java测试框架。但是,只专注于使用框架的技术细节会损害应该指导您的操作的最重要的概念,因此我将讨论这些概念。

  • (对各种事物的测试)将某事物(被测系统,SUT)的实际行为与其预期行为进行比较。

  • 可以使用计算机程序来完成自动测试。由于该比较是由不灵活且不智能的计算机程序完成的,因此必须准确且明确地知道预期的行为。

  • 程序或程序的一部分(类或方法)的预期用途是其规范。因此,测试软件要求您具有SUT的规范。这可能是明确的描述,也可能是您所期望的隐含说明。

  • 因此,自动单元测试需要对要测试的类或方法进行精确且明确的说明。

  • 但是在着手编写代码时需要该规范。因此,测试的一部分实际上是在您编写SUT的哪一行之前就开始的。测试驱动开发(TDD)的测试技术将这一想法发挥到了极致,并在编写要测试的代码之前先创建了单元测试代码。

  • 单元测试框架使用断言测试您的SUT。断言是逻辑表达式(具有boolean结果类型的表达式; 谓词),如果SUT行为正确,则必须为true。因此,该规范必须表示为(或重新表达)为断言。

  • 按合同编程是一种将规范表达为断言的有用技术。这些规范是基于后置条件的。后置条件是关于从方法或构造函数返回后SUT的公开可见状态的断言。一些方法有后置条件 是不变量,它们是在执行该方法之前和之后都为真的谓词。一个 class 也可以说具有不变量,它们是该类的每个构造函数和方法的后置条件,因此始终应该为真。后置条件(和不变式)仅以公开可见状态表示:publicprotected字段,由publicprotected方法(例如getter)返回的值),并将对象的公开可见状态(通过引用)传递给方法。

许多初学者在这里发布问题,询问他们如何测试某些代码,仅提供代码,但未说明该代码的规范。正如本讨论所显示的,任何人都不可能对这个问题给出良好的答案,因为充其量,潜在的回答者必须猜测该规范,并且这样做可能不正确。这个问题的 asker 显然不了解规范的重要性,因此是一个新手,需要了解我在 之前试图描述的基本知识。测试代码。