IDEA创建测试类
本文按以下顺序讲解JUnit4的使用
- 下载jar包
- 单元测试初体验
- 自动生成测试类
- 执行顺序
- @Test的属性
- 代码覆盖率
下载jar包
在github上,把以下两个jar包都下载下来。下载地址:点击打开链接
下载junit-4.12.jar,junit-4.12-javadoc.jar(文档),junit-4.12-sources.jar(源码)。
下载hamcrest-core-1.3.jar,hamcrest-core-1.3-javadoc.jar(文档),hamcrest-core-1.3-sources.jar(源码)。
最前面那个pom是Maven的配置文件,如果你需要的话也下载下来。
单元测试初体验
先创建个简单的项目体验下单元测试是怎么一回事吧。
我创建一个项目叫JUnit4Demo,刚创建好的工程目录如下图,然后在External Libraries中导入刚下载的那两个jar包。
通过Libraries添加Jar包
1.打开 File -> Project Structure ->Modules-> 在Dependencies 下添加jar包
2、+ -> Library... -> java -> 选择jar的路径添加。 添加jar包后如下图所示。
3、创建一个类com.hera.util.Math,然后输入一个求阶乘的方法:
4、创建一个队Math方法的单元测试:
创建一个和src同级别的文件夹叫test(逻辑代码放src里,测试代码放test里是个好习惯)。
接着在IntelliJ IDEA里还要把这个test文件夹要设置成测试文件的根目录,右键选中
Mark Directory As - Test Sources Root。
创建一个测试类:
IntelliJ IDEA提供了一个快捷操作Cmd + Shift + T作为类和测试之间的导航。同时允许用户在那里创建一个测试类。IntelliJ IDEA提供了一个快捷操作Cmd + Shift + T作为类和测试之间的导航。同时允许用户在那里创建一个测试类。
为测试类MathTest添加测试方法:
运行: run MathTest 。右下方一条绿色条说明测试通过,如果把120改成别的数字那么就会测试不通过显色红色条。JUnit4有一句话叫:“keeps the bar green to keep the code clean”。
解释一下MathTest,就六个地方要讲:
第一,导入了org.junit.Test;和org.junit.Assert.*;这两个包,注意后者是静态导入import static。
第二,testFactorial是在要测试的方法名Factorial前加个test(这也是个好习惯)。
第三,所有测试方法返回类型必须为void且无参数。
第四,一个测试方法之所以是个测试方法是因为@Test这个注解。
第五,assertEquals的作用是判断两个参数是否相等,例子中120是预期结果,new Math().factorial(5)是实 际结果。但是通常不应该只比较一个值,要测试多几个特殊值,特别是临界值。
例如Math().factorial(0)和Math().factorial(-1)等。
第六,assertEquals除了比较两个int,还重载了好多次可以比较很多种类型的参数。而且JUnit4包含一堆 assertXX方法,assertEquals只是其中之一,这些assertXX统称为断言。刚不是下载了junit-4.12- javadoc.jar这个文档吗,解压后打开index.html如下图还有一堆断言。
执行顺序
JUnit4利用JDK5的新特性Annotation,使用注解来定义测试规则。
这里讲一下以下几个常用的注解:
- @Test:把一个方法标记为测试方法
- @Before:每一个测试方法执行前自动调用一次
- @After:每一个测试方法执行完自动调用一次
- @BeforeClass:所有测试方法执行前执行一次,在测试类还没有实例化就已经被加载,所以用static修饰
- @AfterClass:所有测试方法执行完执行一次,在测试类还没有实例化就已经被加载,所以用static修饰
- @Ignore:暂不执行该测试方法
我们来试验一下,我新建一个测试类AnnotationTest,然后每个注解都用了,其中有两个用@Test标记的方法分别是test1和test2,还有一个用@Ignore标记的方法test3。然后我还创建了一个构造方法,这个构造方法很重要一会会引出一个问题。
具体代码如下:
package com.xuhongchuan.util;
import org.junit.*;
import static org.junit.Assert.*;
/**
* Created by xuhongchuan on 2015/7/18.
*/
public class AnnotationTest {
public AnnotationTest() {
System.out.println("构造方法");
}
@BeforeClass
public static void setUpBeforeClass() {
System.out.println("BeforeClass");
}
@AfterClass
public static void tearDownAfterClass() {
System.out.println("AfterClass");
}
@Before
public void setUp() {
System.out.println("Before");
}
@After
public void tearDown() {
System.out.println("After");
}
@Test
public void test1() {
System.out.println("test1");
}
@Test
public void test2() {
System.out.println("test2");
}
@Ignore
public void test3() {
System.out.println("test3");
}
}
运行结果如下:
BeforeClass 构造方法 Before test1 After 构造方法 Before test2 After AfterClass
解释一下:@BeforeClass和@AfterClass在类被实例化前(构造方法执行前)就被调用了,而且只执行一次,通常用来初始化和关闭资源。@Before和@After和在每个@Test执行前后都会被执行一次。@Test标记一个方法为测试方法没什么好说的,被@Ignore标记的测试方法不会被执行,例如这个模块还没完成或者现在想测试别的不想测试这一块。
以上有一个问题,构造方法居然被执行了两次。所以我这里要说明一下,JUnit4为了保证每个测试方法都是单元测试,是独立的互不影响。所以每个测试方法执行前都会重新实例化测试类。
我再给你看一个实验:
添加一个成员变量
int i = 0;
然后把test1改为:
i++;
System.out.println("test1的i为" + i);
test2改为:
i++;
System.out.println("test2的i为" + i);
执行结果:
BeforeClass 构造方法 Before test1的i为1 After 构造方法 Before test2的i为1 After AfterClass
可以看到test1和test2的i都只自增了一次,所以test1的执行不会影响test2,因为执行test2时又把测试类重新实例化了一遍。如果你希望test2的执行受test1的影响怎么办呢?把int i改为static的呗。
最后关于这些注解还有一个要说明的就是,你可以把多个方法标记为@BeforeClass、@AfterClass、@Before、@After。他们都会在相应阶段被执行。
@Test的属性
最后来说一下@Test的两个属性
- excepted
-
timeout
excepted属性是用来测试异常的,我们回到Math类,拿其中的求阶乘方法factorial()来说。如果传进来一个负数我们是希望抛出异常的,那要测试会不会抛异常怎么办呢?
我在测试类MathTest添加一个测试方法:
这个方法就是(expected = Exception.class)和fail("factorial参数为负数没有抛出异常");之间的配合。就是这个测试方法会检查是否抛出Exception异常(当然也可以检测是否抛出其它异常),如果抛出了异常那么测试通过(因为你的预期就是传进负数会抛出异常)。没有抛出异常则测试不通过执行fail("factorial参数为负数没有抛出异常");
回到Math类,我创建一个数组排序的方法,用的是冒泡排序。
public void sort(int[] arr) { //冒泡排序 for (int i = 0; i < arr.length - 1; i++) { //控制比较轮数 for (int j = 0; j < arr.length - i - 1; j++) { //控制每轮的两两比较次数 if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
@Test(timeout = 2000) public void testSort() throws Exception { int[] arr = new int[50000]; //数组长度为50000 int arrLength = arr.length; //随机生成数组元素 Random r = new Random(); for (int i = 0; i < arrLength; i++) { arr[i] = r.nextInt(arrLength); } new Math().sort(arr); }运行结果测试不通过,且提示TestTimedOutException。
public void sort(int[] arr) { //快速排序 if (arr.length <= 1) { return; } else { partition(arr, 0, arr.length - 1); } } static void partition(int[] arr, int left, int right) { int i = left; int j = right; int pivotKey = arr[left]; //基准数 while (i < j) { while (i < j && arr[j] >= pivotKey) { j--; } while (i < j && arr[i] <= pivotKey) { i++; } if (i < j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } if (i != left) { arr[left] = arr[i]; arr[i] = pivotKey; } if (i - left > 1) { partition(arr, left, i - 1); } if (right - j > 1) { partition(arr, j + 1, right); } }然后再运行一下测试类MathTest,绿色条出现了,测试通过妥妥的。
编辑测试设置
我们可以通过Run → Edit Configurations或工具栏上的标签来调整我们的测试运行配置。
在Configuration选项卡,用户可以选择需要运行的测试。例如,您可以从一个类、程序包、测试套件或甚至模式中运行所有的测试。这里的Fork模式让用户在一个单独的进程运行每个测试。
在代码覆盖标签你可以调整覆盖率设置。目前IntelliJ IDEA支持两种测量覆盖率引擎。默认情况下它使用自己的引擎,当然用户也可以选择JaCoCo引擎。用户也可以在这里选择覆盖率模式。Tracing{span{ mode模式会增加消耗,但测量会更精确。
运行覆盖
收集覆盖率,用户需要通过Run → Run 'MyClassTest' with Coverage或工具栏上的选项运行特定模式的测试。
当覆盖模式运行至少一个测试之后,IDE将会在Project工具窗口显示每个程序包、类的覆盖率数据,同时在Coverage工具窗和编辑器中也会显示。
编辑器中的覆盖率
如果用户添加另一个方法到MyClass,并运行覆盖率测MyClass,就会发现,没有被测试覆盖到的代码都将高亮显示为红色。覆盖的代码颜色则是绿色。如果一些代码是只覆盖部分,那没将显示为黄色。
相关推荐
传统方式创建mybatis项目 1.创建java项目 2.导入mybatis资源 3.创建主配置文件:mybatis.xml 4.创建分层包 5.... 6.... 7.... 8.创建sql映射文件:接口名称.xml... test 存放测试类 类/接口的格式:接口名称+方法+Test
要求使用orm框架,在其中创建一个包含全部功能需求(方法)的接口,再创建接口的实现类,再通过测试类实现功能,还有数据库三层架构:分别创建三个包为dao包负责数据库数据的存取,service业务层负责逻辑的操作,...
测试类 4.2.3 @Qualifier注解 配置类2 测试类2.1 测试类 2.2 配置类3 HelloController.java① HelloController.java② 4.2.4 @Primary 主候选的 4.2.5 @Import注解 4.2.6 @ComponentScan("com.bjpowernode")配置扫描...
前言一.Intellij IDEA 初体验二.Intellij IDEA 基本常识Debug 讲解自动生成代码选择重写,实现接口的方法自动创建 Test 测试类插件介绍打jar包和打war包三.版本控制篇版本控制总介绍svn 集成svn 简单使用git和github...
1.4 创建Javabean测试类 1.5 创建切面 1.6 测试类 1.7 测试结果 1.8 结论 1.9 代理方式的切换 1.9.1 设计一个接口ManInterface 1.9.2 javaBean目标类Man实现ManInterface接口 1.9.3 修改application.yml文件的切换...
Ctrl+Alt+T 创建单元测试用例 Alt+Shift+F10 运行程序 Shift+F9 启动调试 Ctrl+F2 停止 Crtl+N:定位到Java类 Crtl+Shift+N:定位到文件 Crtl+Alt+Shift+N:定位到标识,这里标识主要是指Java类中的属性和函数名 ...
SpringBoot实战:整合jUnit测试框架一、前言二、添加依赖三、简单业务代码四、创建测试类五、运行测试类1.单个方法或类的测试2.运行整个项目的测试方法2.1.使用IDEA运行整个项目的测试类2.2.使用maven命令运行整个...
fonts-js-unpackage // apk存放位置-audio.html-index.html // 测试住界面-manifest.jsonmobilewebvoiceChat-src-main-java-com-chat-common // 通用类-util // 工具类-sys-web-entity-service-socket-web-resources...
6.2 创建Service接口和实现类 6.3 测试查询记录数 6.4 测试批量插入 常用注解 1、@TableName 2、@TableId 3、@TableField 4、@TableLogic 4.1 逻辑删除 4.2 实现逻辑删除 4.3 实体类中添加逻辑删除属性 4.4 测试 ...
是用idea开发的,有源代码,并有red说明文档,可运行的。我邮件为350038760@qq.com
四、测试类 4.1 一个对象转JSON 4.2 多个对象转JSON 4.3 JSON字符串转一个对象 4.4 JSON字符串转多个对象(List) 4.4.1 错误案例 4.4.2 正确案例 1、Java 解析 Json 最常用的类库有:google 的 Gson、阿里巴巴的 ...
打开IDEA创建一个Maven项目 注意这里我们不用模板,就直接选择jdk后点击【Next】就可以了 第四步:创建映射文件 在静态资源【resources】创建一个配置文件,它的路径要和他的接口一样...
使用idea和maven 整合了ssm项目的基本配置,test包中有测试类,domain只包含一个teacher类,可自行根据字段创建数据库。测试可运行
执行SQL,创建数据库 项目导入IDEA 启动 访问测试! 自行根据代码逻辑填充测试数据,查看即可! src/main/java/com/kuang - config 配置类 - controller controller - generator 代码生成器 - mapper mapper - pojo...
@ConfigurationProperties注解使用方法(源代码) ...3.1.2.7 测试类 3.1.3问题与解答 问题: 解答与分析: 案例实操 3.2 作用于Class类及其用法 3.2.1 数据库的创建 3.2.2创建并搭建项目 3.2.3 添加依赖 3.2.3.
JAVA操作MS office 工具 POI操作WORD 官方测试案例 DEMO(含jar包,IDEA) 可直接运行测试。 ------------------------------------------------------ 1 什么是Apache POI 全称Apache POI,使用Java编写的免费...
跑 Run.jl提供了在隔离的环境中运行测试或构建文档的功能。... 使用以下命令创建一个文件,例如.github/workflow/test.yml : name : Run testson : push : branches : - master tags : ' * ' pull_request :jobs
四、如何通过IDEA创建SpringBoot项目 1、主程序类,主入口类 2、编写相关的Controller、Service 3、测试运行 一、回顾什么是Spring ? 跳转到目录 Spring是一个开源框架,2003 年兴起的一个轻量级的Java 开发框架,...
在项目中创建必要的包和类。 编写控制器(Controller)类来处理HTTP请求。 编写服务(Service)类来处理业务逻辑。 编写数据访问对象(DAO)或仓库(Repository)类来与数据库交互。 编写配置类(Configuration)来...
创建项目:使用IDE(如Eclipse、IntelliJ IDEA)创建一个新的Java项目。 面板设计:使用Java Swing或JavaFX创建各个面板,可以使用布局管理器来布局面板上的组件。 接口设计:创建Java接口来定义系统的各个模块...