目录

  • 单元测试的几个相关概念

  • 工具准备

  • 构建Maven项目

  • 创建JUnit Test Case

  • JUnit4注解、断言等基础知识

  • JUnit Test Case运行

  • JUnit Test Suite运行

  • 测试报告-单元测试覆盖率、通过率


单元测试的几个相关概念

白盒测试 —把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。

回归测试 —软件或环境的修复或更正后的“再测试”,自动测试工具对这类测试尤其有用。

单元测试 —是最小粒度的测试,是针对一个独立的工作单元进行正确性验证的测试。有时也被称为程序员测试,以同QA测试、客户测试相区分。

JUnit —是一个开放源代码是java测试框架,用于编写和运行可重复的测试。它是用于单元测试框架体系xUnit的一个实例(用于java语言)。主要用于白盒测试、回归测试。

Maven —内置软件仓库,帮助构建打包管理项目。



工具准备

Java JDK:略

Maven:

Maven下载:http://maven.apache.org/download.html

解压到目录,如:C:\Dev\apache-maven-3.5.0

设置环境变量:

M2_HOME:C:\Dev\apache-maven-3.5.0

path: %M2_HOME%\bin

创建本地仓库地址:

mkdir .m2 -->cd .m2-->mkdir repository ----依赖包会拉到此目录

复制settings.xml到.m2

修改settings.xml

<localRepository>F:\.m2\repository</localRepository>

<mirrors>--添加maven阿里云中央仓库:

<mirror>

<id>alimaven</id>

<name>aliyun maven</name>

<url>http://maven.aliyun.com/nexus/content/groups/public/</url>

<mirrorOf>central</mirrorOf>

</mirror>


Eclipse:

配置maven环境:

eclipse-->window -->preferences -->Maven

Installations:

User Settings:


构建maven项目

导入本地已存在项目,或从svn检出,或新建。过程略。


被测程序:Calculator

package com.lyndachen.junit.demo;


public class Calculator {

private static int result;


public void add(int n) {

result += n;

}


public void substract(int n) {

result -= 1;

}


public void multiply(int n) {

// result =result * n;

}


public void divide(int n) {

result = result / n;

}


public void square(int n) {

result = n * n;

}


public void squareRoot(int n) {

for (;;);

}


public void clear() {

result = 0;

}


public int getResult() {

return result;

}

}


生成JUnit测试框架

右击类名,点击新建,或者新建里的others,选择JUnit test case:

选择测试类路径,确认测试类名字,勾选需要的方法,要测试的类:

选择要被测试的方法:

生成测试类CalculatorTest,里面包含一些空的测试用例:

补充测试用例:

package com.lyndachen.junit.demo;


import static org.junit.Assert.*;


import org.junit.After;

import org.junit.AfterClass;

import org.junit.Before;

import org.junit.BeforeClass;

import org.junit.Ignore;

import org.junit.Test;


public class CalculatorTest {


private static Calculator calculator = new Calculator();


@Before

public void setUp() throws Exception {

calculator.clear();

}



@Test

public void testAddWith2and3() {

calculator.add(2);

calculator.add(3);

assertEquals(5, calculator.getResult());

}


@Test

public void testAddWith1AndIntegerMax() {

calculator.add(1);

calculator.add(Integer.MAX_VALUE);

assertEquals(Integer.MIN_VALUE, calculator.getResult());

}


@Test

public void testAddWith1to100() {

for (int i = 0; i <= 100; i++) {

calculator.add(i);

}

assertEquals(5050, calculator.getResult());

}


@Test

public void testSubstract() {

calculator.add(-2);

calculator.substract(0);

assertEquals(-2, calculator.getResult());

}


@Test

public void testSubstractWith0andIntegerMax() {

calculator.substract(Integer.MAX_VALUE);

assertEquals(Integer.MIN_VALUE + 1, calculator.getResult());

}


@Ignore

public void testMultiply() {

calculator.add(2);

calculator.multiply(2);

assertEquals(4, calculator.getResult());

}


@Test

public void testDivide() {

calculator.add(2);

calculator.divide(2);

assertEquals(1, calculator.getResult());

}


@Test

public void testDivideWith3and2() {

calculator.add(3);

calculator.divide(2);

assertEquals(1, calculator.getResult());

}


@Test

public void testDivideWith2and3() {

calculator.add(2);

calculator.divide(3);

assertEquals(0, calculator.getResult());

}


@Test(expected = ArithmeticException.class)

public void testDivideWith2And0() {

calculator.add(2);

calculator.divide(0);

}

}


JUnit测试类和方法的声明

测试类的声明

•测试类是一个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。但是建议都用类名+Test来命名。

测试方法的声明

•在测试类中,并不是每一个方法都是用于测试的,你必须使用“标注”也叫注解来明确表明哪些是测试方法。

@Before、 @Test、@Ignore

•使用@Test注解,以表明这是一个测试方法•方法名字可以随便取,没有任何限制,但是规范写法是test+方法名,方法名第一个字母大写•方法的返回值必须是void•方法不能有任何参数•如果违反这些规定,运行时会抛出一个异常


JUnit4注解解释
  @Before: 每一个测试方法之前运行

  @After : 每一个测试方法之后运行

  @BeforeClass: 所有测试开始之前运行

  @AfterClass: 所有测试结束之后运行

@Test : 测试方法,测试程序会运行的方法,可以跟参数代表不同的测试

  @Test(expected=*.class):异常测试,expected属性的值是一个异常的类型

  @Test(timeout=xxx):超时测试,如果测试方法在制定的时间之内没有运行完,则测试也失败。

@Ignore:被忽略的测试方法。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。


JUnit断言方法示例:


测试代码详解


importstatic org.junit.Assert.*;


importorg.junit.After;

importorg.junit.AfterClass;

importorg.junit.Before;

importorg.junit.BeforeClass;

importorg.junit.Ignore;

importorg.junit.Test;


•import static org.junit.Assert.*;我们在测试的时候使用的一系列assertEquals等方法就来自这个包。

•org.junit.Ater(After、BeforeClass、AfterClass;、Ignore、Test)表示Junit框架中的相关包,我们用到的注解就需要这些包的支持。

可以写成一行import org.junit.*;将所以可能需要的包都引入了。


privatestatic Calculator calculator =new Calculator();

•你要测试哪个类,那么你首先就要创建一个该类的对象•为了测试Calculator类,我们必须创建一个calculator对象


@Test

publicvoid testAddWith2and3() {

calculator.add(2);

calculator.add(3);

assertEquals(5, calculator.getResult());

}

•我们期待的结果应该是5•assertEquals(5, calculator.getResult());就是来判断期待结果和实际结果是否相等

•第一个参数填写期待结果,第二个参数填写实际结果

•JUnit会自动进行测试并把测试结果反馈给用例


@BeforeClass

publicstatic void setUpBeforeClass()throws Exception {}

@AfterClass

publicstatic void tearDownAfterClass()throws Exception {}

@Before

publicvoid setUp()throws Exception {

calculator.clear();}

@After

publicvoid tearDown()throws Exception {}

•@Before、@After 是每个方法测试时候必然被调用的代码。保证每一个测试都是独立的,相互之间没有任何耦合度。这里不需要@Test标注,因为这不是一个test

•只在测试用例初始化时执行@BeforeClass方法,当所有测试执行完毕之后,执行@AfterClass进行收尾工作。用于测试读取文件等耗时的方法。该方法必须是public和static的。

•注意@BeforeClass和@AfterClass只会执行一次

•@Before、@After是每个测试用例执行的时候都会执行

•测试开始->setUpBeforeClass -> setUp->testXXX-> tearDown -> setUp ->testXXX -> tearDown-> …… -> tearDownAfterClass -> 测试结束


JUnit测试脚本运行

在CalculatorTest类上点右键,选择Run As --> JUnitTest来运行:


运行结果如下,有失败用例时,显示失败详情:

运行结果说明:

绿色√表示测试通过;

蓝色x表示测试运行失败Failure,指的是预期结果与实际运行单元的结果不同;

红色x表示测试抛出异常导致的失败Error,指的是您程式没有考虑到的情况,在断言之前程式就因为某种错误引发例外而终止;


JUnit Test Suite


可以创建JunitTest Cuite,同时运行多个测试case:

测试类右键-->new-->other:

搜索JunitTest Suite,下一步,选择测试类:

与JunitTest Case一样,AllTest类上点右键,选择Run As -->JUnit Test运行:

测试集

import org.junit.runner.RunWith;

import org.junit.runners.Suite;

import org.junit.runners.Suite.SuiteClasses;


@RunWith(Suite.class)

@SuiteClasses({ CalculatorTest.class, CalculatorTest2.class })

public class AllTests {

}

步骤:

1.用@RunWith标注传递 一个参数Suite.class

2.用@SuiteClasses表明这个类是一个打包测试类

3.把需要打包的类作为参数传递给该标注


测试报告


Maven插件cobertura-maven-plugin提供单元测试整体覆盖率以及分支覆盖率的工具,给编写单元测试的开发者提供一个参考,看其中是否存在有重要代码遗漏的情况。

首先在pom.xml中做如下配置:

<reporting>

<plugins>

<plugin>

<groupId>org.codehaus.mojo</groupId>

<artifactId>cobertura-maven-plugin</artifactId>

</plugin>

</plugins>

</reporting>


然后在项目目录下运行mvncobertura:cobertura,即可生成target目录下生成site\cobertura目录,里面存放了所有的单元测试报告,组织形式如javadoc.其中index.html对所有包的覆盖率做了统计。

点击任意包名,再点击类名,可以看到类中每一行代码是否被覆盖:

如上图所示,左端行号上为绿色的表示应该被覆盖到的代码行,右边无颜色的为已覆盖的代码,红色的为未覆盖的代码。


在项目下运行命令mvnsurefire-report:report,会在target/site下面生成html的报告surefire-report.html


THANK YOU!

个人微信公众号: hi_chen00 (软件测试札记)

JUnit单元测试快速入门相关推荐

  1. Jest 单元测试快速入门

    测试的类型 单元测试 集成测试 端到端测试(E2E) 测试 React 组件需要解决两个关键问题 怎么渲染待测试组件: 怎么测试渲染出来的组件: 浅层渲染 对于组件渲染,Airbnb 作为重度使用 R ...

  2. Java单元测试-快速上手Junit

    基于Eclipse的单元测试框架Junit入门 Junit简介 JUnit是一个Java语言的单元测试框架,应用它进行单元测试,能够准确.快速地保证程序基本模块的正确性.Junit通过注解的方式来识别 ...

  3. 快速入门JAVA单元测试——mock

    背景 为了确保代码的质量,对编写的代码进行单元测试是非常有必要的. 在JAVA项目中,一般的项目结构比较复杂.依赖众多.在微服务与spring boot大行其道的今天,单纯靠junit来进行单元测试一 ...

  4. IDEA Java Junit单元测试入门实战

    IDEA Java Junit单元测试入门实战 1.下载jar包 2.在IDEA中添加jar包 3.创建单元测试代码 junit的使用: junit不是javase的一部分,想要使用需要导入jar包. ...

  5. iOS 单元测试和 UI 测试快速入门

    iOS 单元测试和 UI 测试快速入门 前言 平时写完业务代码的时候都会去自己测试一遍,后面每次有修改都需要重复测,不管是一个业务流程还是一个工具类,其实都可以通过测试框架来帮助我们完成测试,特别是一 ...

  6. 十二 Spring的AOP开发入门,整合Junit单元测试(AspectJ的XML方式)

    创建web项目,引入jar包 引入Spring配置文件 编写目标类,完成配置 编写测试类 Spring整合Junit单元测试 编写一个切面类 配置切面类,产生代理: <?xml version= ...

  7. 【转】Spring Boot快速入门

    为什么80%的码农都做不了架构师?>>>    简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复 ...

  8. [vs2010 project] CppUnit快速入门

    简介 测试是软件开发过程中极其重要的一环,详尽周密的测试能够减少软件BUG,提高软件品质.测试包括单元测试.系统测试等.其中单元测试是指针对软件功能单元所作的测试,这里的功能单元可以是一个类的属性或者 ...

  9. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

最新文章

  1. quartz获取开始结束时间_王者荣耀s21什么时候开始是9月24日吗?王者荣耀s20赛季结束时间...
  2. guava缓存数据到本地_扩展Guava缓存以溢出到磁盘
  3. mongodb 安装、启动
  4. java 反射 成员变量_java基础--反射(成员变量)
  5. tensorflow训练神经网络时loss出现nan的问题
  6. FreeModbus源码获取
  7. 如何导入外部Git仓库到中国源代码托管平台(Git@OSC)
  8. java 字符串池 原理_《Java虚拟机原理图解》1.2.2、Class文件中的常量池详解(上)...
  9. xml获取配置DataTable
  10. C语言实现windows进程遍历
  11. halcon学习资料
  12. 从零开始学编程系列汇总
  13. 程序员人生:技术人员的职业发展规划
  14. Hive实现环比和同比
  15. iPone强制关机 小技巧
  16. 计算机 英语词汇 缩写,计算机相关的53个英语单词缩写
  17. 邓俊辉 数据结构 习题4-18 Fermat-Lagrange定理代码实现
  18. 吃透浏览器安全(同源限制/XSS/CSRF/中间人攻击)
  19. 川大和哈工大计算机学院,哈尔滨工业大学计算机科学与技术学院
  20. GraphQL以及Apollo-GraphQL的使用(一)

热门文章

  1. linux系统垃圾清理
  2. mysql 最大值7F_(总结)MySQL my.cnf参数配置优化详解
  3. 阿里 MySQL 规约_阿里手册 Mysql 数据库规约
  4. KY129简单计算器
  5. python中divmod函数的用法
  6. 电脑网络维护维修基础知识,及常见故障的解决方法汇总
  7. Linux网络学习与总结(1)
  8. 中国Q4净利3180万美元
  9. Android : WebRTC中设置 Video Stabilization 遇到的一个兼容性问题
  10. 无论何时,请保持微笑