如何编写单元测试?

Tsu*_*oku 129 java unit-testing

我有一个Java类.我怎样才能 对它进行单元测试


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

jay*_*100 128

  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));
      }
      
      Run Code Online (Sandbox Code Playgroud)
  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));
      }
      
      Run Code Online (Sandbox Code Playgroud)

  • 是的,`@ Test`表示法是必需的.这样做是为了向单元测试运行器发出信号,表明该方法代表单元测试并且应该执行.未使用`@Test`注释的方法不会由测试运行器执行. (9认同)

Vah*_*hid 87

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

1-单击New - > Java Project.

创建项目

2-记下项目名称,然后单击"完成".

创建项目

3-右键单击您的项目.然后,单击New - > Class.

创建类

4-记下你的课程名称,然后点击完成.

创建类

然后,像这样完成这个类:

public class Math {
    int a, b;
    Math(int a, int b) {
        this.a = a;
        this.b = b;
    }
    public int add() {
        return a + b;
    }
}
Run Code Online (Sandbox Code Playgroud)

5-单击文件 - >新建 - > JUnit测试用例.

创建JUnite测试

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

检查SetUp()

7-单击"确定".

添加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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

运行JUnit测试

10-这是测试的结果.

测试结果

我希望它有所帮助.

  • 喜欢你的答案,这是最好的"操作方法"! (9认同)
  • 我很高兴我的回答很有帮助.感谢您的评论. (3认同)
  • 这就是教程应该是什么样子;干净,简洁,完整的例子。非常好。 (2认同)

Ser*_*mme 17

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

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

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

  1. 两个正数之间的简单加法.添加它们,然后验证结果是否符合预期.
  2. 正数和负数之间的加法(返回带有第一个参数符号的结果).
  3. 正数和负数之间的加法(返回带有第二个参数符号的结果).
  4. 两个负数之间的加法.
  5. 添加导致溢出.

要验证结果,可以使用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() { ... }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 8

就像提到的@CoolBeans一样,看看jUnit.这是一个简短的教程,可以帮助您开始使用jUnit 4.x

最后,如果您真的想要了解有关测试和测试驱动开发(TDD)的更多信息,我建议您查看Kent Beck的以下书籍:测试驱动开发示例.


Rae*_*ald 6

其他答案向您展示了如何使用 JUnit 来设置测试类。JUnit 不是唯一的 Java 测试框架。然而,专注于使用框架的技术细节会偏离应该指导你的行动的最重要的概念,所以我将讨论这些。

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

  • 自动化测试可以使用计算机程序来完成。因为这种比较是由一个不灵活和不智能的计算机程序完成的,所以必须准确无误地知道预期的行为。

  • 一个程序或程序的一部分(一个类或方法)应该做什么是它的规范。因此,测试软件要求您有 SUT 的规范。这可能是明确的描述,也可能是您头脑中对预期内容的隐含说明。

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

  • 但是当您开始编写该代码时,您需要该规范。因此,在您编写甚至一行 SUT 之前,测试的部分内容实际上已经开始。测试驱动开发 (TDD) 的测试技术将这种想法发挥到极致,让您在编写要测试的代码之前先创建单元测试代码。

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

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


许多初学者在这里提出问题,询问他们如何测试一些代码,展示代码但没有说明该代码的规范。正如此讨论所示,任何人都不可能对这样的问题给出一个好的答案,因为潜在的回答者充其量只能猜测规范,并且可能会做出错误的猜测。问题的提问者显然不了解规范的重要性,因此是一个新手,需要尝试编写一些测试代码之前了解我在此处描述的基础知识。