1:测试分类

2:常用测试方法

2.1 断言语句

3: 基本测试

4: 组合测试

5:参数化测试

6:分类测试(Category)

1:测试分类

  •  1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。
  • 2. 白盒测试:需要写代码的。关注程序具体的执行流程。

2:常用测试方法

Junit 组合测试注解:

  •  RunWith      指定测试类的为指定容器 可以为 Category SuitCase
  • Parametered  建立参数类 且必须提供一个内部的静态方法 返回一个集合的Collection<Object[]>
  • Runwith 必须是Parameterized.class
  •  Category 将测试方法 分类
  • RunWith 必须指定为Categories.class
  • FixMethodOrder  定义测试次序

 2.1 断言语句

Assert类 以静态方法 提供了一系列的测试方法

Method

Description

assertNull(java.lang.Object object)

检查对象是否为空

assertNotNull(java.lang.Object object)

检查对象是否不为空

assertEquals(long expected, long actual)

检查long类型的值是否相等

assertEquals(double expected, double actual, double delta)

检查指定精度的double值是否相等

assertFalse(boolean condition)

检查条件是否为假

assertTrue(boolean condition)

检查条件是否为真

assertSame(java.lang.Object expected, java.lang.Object actual)

检查两个对象引用是否引用同一对象(即对象是否相等)

assertNotSame(java.lang.Object unexpected, java.lang.Object actual)

检查两个对象引用是否不引用统一对象(即对象不等)

Fail()

直接返回一个测试失败的方法

  3: 基本测试

public class Usually_Test {
private int a;
private int b;
@BeforeClass
public static void start() {
System.out.println("start--------");
}
@Before
public void before() {
this.a=;
this.b=;
}
@Test
public void testAdd() {
int res=add(a, b);
assertEquals(, res);
}
@Ignore
public void testAdd2() {
int res=add(a, b);
assertEquals(, res);
System.out.println("testAdd2方法被忽略");
}
public static int add(int a,int b) {
return a+b;
}
@After
public void after() {
this.a=;
this.b=;
}
@AfterClass
public static void end() {
System.out.println("end-----------");
}
}

4: 组合测试

@RunWith(Suite.class)  //标示为组合测试
@SuiteClasses({A.class,B.class}) // 被测试的类必须为public类
public class ALLTest {
// all test
}
public class A{
@Test
public void test_m() { }
}
public class B{
@Test
public void test_m() { }
}

5:参数化测试

必须提供@Parameter方法,方法的返回必须是public static Collection,不能有参数,

并且collection元素必须是相同长度的数组。同时数组的长度必须与测试类的字段(m1,m2,result)的数量相匹配

  • 参数字段必须是public
@RunWith(Parameterized.class) // 必须指定为Parameterized.class
public class ParameterizedTestFields {
@Parameterized.Parameter()
public int a;
@Parameterized.Parameter()
public int b;
@Parameterized.Parameter()
public int result;
// public int a;
// public int b;
// public int result;
// // 可以使用构造方法代替
// public ParameterizedTestFields(int a, int b, int result) {
// super();
// this.a = a;
// this.b = b;
// this.result = result;
// }
// creates the test data
@Parameterized.Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] { { , , }, { , , }, { , , } };
return Arrays.asList(data);
}
@Test
public void testMultiplyException() {
Usually_Test test = new Usually_Test();
Assert.assertEquals("Result", result, test.mul(a, b));
}
}

参数不匹配将会抛出java.lang.IllegalArgumentException: wrong number of arguments

6:分类测试(Category)

  • @Category 可以作用于类上,方法上
  • 聚合测试属性
  • @Categories.ExcludeCategory 要排除测试的那些类
  • @Categories.IncludeCategory  要测试包含测试的那些类
// 两个标记接口
interface FastTests { }
interface SlowTests { }
// 主测试类
@RunWith(Categories.class)
@Categories.IncludeCategory({FastTests.class})
@SuiteClasses({A.class,B.class})
public class TestAndCategory {
/**
* A: 这里A类的 test_m1 被FastTests标注 test_m2 被SlowTests接口标注
* B: 这里B类被 SlowTests FastTests两个接口标准
*/
@Test
public void test() {
}
}
// 两个测试类
public class A{
@Test
@Category(FastTests.class)
public void test_m1() {
System.out.println("A类的 test_m1 FastTests 被执行");
}
@Test
@Category(SlowTests.class)
public void test_m2() {
System.out.println("A类的 test_m2 SlowTests 被执行");
}
}
@Category({FastTests.class,SlowTests.class}) // 类中的方法都会被标注
public class B{
@Test
public void test_m() {
Assert.assertTrue(System.getProperty("os.name").contains("Windows"));
} @Test
public void test_m2() {
System.out.println("B类的 test_m2 SlowTests");
}
}

7:Rule测试

Junit中的规则 即实现了TestRule接口,已久为我们实现了以下一些内容

规定 实现了TestRule接口的类构建实例必须用以下注解标准

  • @Rule     @Rule是方法级别的,每个测试方法执行时都会调用被注解的Rule
  • @RuleClass   在执行一个测试类的时候只会调用一次被注解的Rule。
  • 要求 @Rule  @RuleClass 必须是Public的字段

ExpectedException 抛出异常例子

public class User_RuleTest {
@Rule
public ExpectedException exception=ExpectedException.none();
/**
* 1:必须抛出ArrayIndexOutOfBoundsException
* 2:异常消息为1
*/
@Test
public void test_ExpectedException() {
exception.expect(ArrayIndexOutOfBoundsException.class);
exception.expectMessage("");
ThrowExceptionClass t = new ThrowExceptionClass();
t.methodToBeTest();
}
}
class ThrowExceptionClass{ public void methodToBeTest(int i) {
if (i == ) {
throw new ArrayIndexOutOfBoundsException("");
}
}
}

   TemporaryFolder 创建零时文件例子(自动删除)

public class Use_Rule_Test2 {
@Rule
public TemporaryFolder tFolder=new TemporaryFolder(); @Test
public void tets_CreateTempFiles() throws IOException {
File createdFolder = tFolder.newFolder("newfolder");
File createdFile = tFolder.newFile("myfilefile.txt");
Assert.assertTrue(createdFile.exists());
Assert.assertTrue(createdFolder.exists());
} }

8: 常见异常

java.lang.Exception: No tests found matching:  导入hamcrest-all 1.3版本 我是junit 4.12

java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=test_ExpectedException], {ExactMatcher:fDisplayName=test_ExpectedException(Junit_case.User_RuleTest)], {LeadingIdentifierMatcher:fClassName=Junit_case.User_RuleTest,fLeadingIdentifier=test_ExpectedException]] from org.junit.internal.requests.ClassRequest@60215eee
at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:40)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createFilteredTest(JUnit4TestLoader.java:83)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:74)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:525)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

org.junit.internal.runners.rules.ValidationError: The @Rule 'exception' must be public. 字段要求为Public
at org.junit.internal.runners.rules.RuleMemberValidator$MemberMustBePublic.validate(RuleMemberValidator.java:222)
at org.junit.internal.runners.rules.RuleMemberValidator.validateMember(RuleMemberValidator.java:99)
at org.junit.internal.runners.rules.RuleMemberValidator.validate(RuleMemberValidator.java:93)
at org.junit.runners.BlockJUnit4ClassRunner.validateFields(BlockJUnit4ClassRunner.java:196)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:129)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:90)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:525)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

搞定Junit单元测试{非专业}的更多相关文章

  1. 一文搞定Spring Boot + Vue 项目在Linux Mysql环境的部署(强烈建议收藏)

    本文介绍Spring Boot.Vue .Vue Element编写的项目,在Linux下的部署,系统采用Mysql数据库.按照本文进行项目部署,不迷路. 1. 前言 典型的软件开发,经过" ...

  2. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  3. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  4. 教你怎么半天搞定Docker

    首先,不要把docker想的那么高大,它不就是先做个镜像,然后通过docker像虚拟机一样跑起来嘛...docker其实在真实业务场景中还是非常有局限性的.Dockerfile脚本也没那么好写,有些应 ...

  5. 用ORM的思想操作XML文档,一个对象就搞定不要太简单。滚蛋吧!XmlDocument、XmlNode、Xml***……

    大家有没有这样的感受,一涉及XML文档操作就得百度一遍.是不是非!常!烦!.各种类型,各种方法,更别提为了找到一个节点多费劲.本来想写个XML操作的工具方法,写了两行一想既然XML文档是有规律的,如果 ...

  6. JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查)

    前言:关于Vue框架,好几个月之前就听说过,了解一项新技术之后,总是处于观望状态,一直在犹豫要不要系统学习下.正好最近有点空,就去官网了解了下,看上去还不错的一个组件,就抽空研究了下.最近园子里vue ...

  7. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查

    前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...

  8. 如何让两个div在同一行显示?一个float搞定

    最近在学习div和css,遇到了一些问题也解决了很多以前以为很难搞定的问题.比如:如何让两个div显示在同一行呢?(不是用table表格,table对SE不太友好)其实,<div> 是一个 ...

  9. 3小时搞定一个简单的MIS系统案例Northwind,有视频、有源代码下载、有真相

    一.瞎扯框架.架构 楼主自从1998年从C语言.MASM.Foxbase开始学计算机开始接触这个行当16年以来,2001年干第一份与程序.软件.然后是各种屌的东西开始,差不多干了13年了,这13年来, ...

随机推荐

  1. 表单生成器(Form Builder)之mongodb表单数据查询——统计查询求和

    上一篇笔记仅是记录了一下简单的关联查询,根据笔记中的场景:将某一车辆关联的耗损记录全部放在了一个字段当中.不知道现在中有没有这种场景,我们的应用中没有类似的场景,可能我们更关注的是某车辆的总耗损金额和 ...

  2. 搭建Harbor

    搭建Harbor 一.安装准备 二.安装docker-ce 三.安装docker-compose 四.安装harbor 5.1下载安装程序 5.2配置harbor.yml 5.3运行install.s ...

  3. java之Set接口(单列集合)

    Set接口概述 java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Coll ...

  4. Springboot整合Mybatis实现级联一对多CRUD操作

    在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...

  5. 【linux命令】chgrp改变文件或目录的属组

    在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...

  6. kaldi使用thchs30数据进行训练并执行识别操作

    操作系统 : Ubutu18.04_x64 gcc版本 :7.4.0 数据准备及训练 数据地址: http://www.openslr.org/18/ 在 egs/thchs30/s5 建立 thch ...

  7. excel中添加下拉候选

    这里简单记录下如何在Excel2013中添加下拉候选. 首先有个思路是,下拉候选也就意味着数据被限制在一个范围之内,因此应该联想到数据验证相关的设置. 选中单列或单元格,在[数据]下的[数据验证]中选 ...

  8. 【解决】MySQL提示启动成功,实际进程并没有起来

    一.概括: 1.查看运行日志 vim /var/log/mariadb/mariadb.log 2.修改配置文件 vim /etc/my.cnf 3.修改文件权限 chown mysql.mysql ...

  9. 利用 chunked 类型响应实现后台请求的监听

    Koa 中实现 chunked 数据传输 中介绍了如何在 Koa 中实现 Transfer-Encoding:chunked 类型的响应分片传输.这里来看一个应用场景. 假如我们想监听后台的请求,并将 ...

  10. Linux配置部署_新手向(三)——MySql安装与配置

    目录 前言 安装 防火墙 小结 前言 马上就要放假了,按捺不住激动的心情(其实是实在敲不下去代码),就继续鼓捣虚拟机来做些常规的安装与使用吧,毕竟闲着也是闲着,唉,opengl还是难啊. 安装 其实网 ...