测试用例

单元测试时每个开发人员必需掌握的,是保证开发过程中代码的准确性,无误性,保证代码质量。敏捷开发模式是先根据用户需求写测试用例,考虑基本所有用户所需要的情况,再写实现方法。单元测试有很多种,当前主流的是Junit,它是java领域测试中应用最多的开源框架

Junit版本

Junit3.8    基于反射的

Junit4    基于注解的

规范:junit测试代码与待测试源代码(src)分开,方便剔除测试代码。

在项目工程中new->Source Folder新建一个源代码目录"test"

在test源码目录中,创建与src目录下相同结构的包,这样测试类中就不必导入源代码 所在的包,因为他们位于同一个包下面

测试类的命名规则:假如目标类是 Calc,那么测试类应该命名为 TestCalc 或者是 CalcTest

看下目录结构

目录src与目录test内

编译后放到相同的目录bin内

测试用例(Test case)方法须满足如下原则:

  1. public修饰符修饰;
  2. 无返回值void;
  3. 无方法参数                 //不满足前三条的测试方法不会执行。
  4. 方法名须以test开头。        //命名规范

测试要保持状态的一致性,测试之前是什么状态,测试执行完之后就应是什么状态,而不应该由于测试执行的原因导致状态的改变。比如对一些文件的修改和对数据库的访问修改。

测试用例之间一定要保证完全的独立性,不允许出现任何依赖关系。

对于待测方法的测试前后的工作可以在setUp()和tearDown()方法中完成。他们的执行顺序如图:

测试方法不能依赖方法的执行顺序,结合上图,可以看出测试方法并不按照顺序执行,但是每次测试,前后都会执行setUp()和tearDown()。

Junit 默认有一个视图,当然,也有写main方法执行的Java Application运行方式。即:

    public static void main(String[] args) {

        junit.textui.TestRunner.run(CalcTest.class);

    }

运行结果如下:

这里第一行的每个点代表一个测试。

在实际开发里面,main方法的测试用得会多一点,因为开发中会把它放到自动构建文件中,直接一点就自动运行了。总归,图形界面会慢很多。

对于同一个方法的不同情况,要进行多次不同情况的测试,如测试div()方法,有除数是否为0两种情况。对div()方法做修改,判断除数,若为0,抛出异常:

public int div(int a, int b) throws Exception {

        if (b==0) {

            throw new Exception("除数不能为0!");

        }

        return a / b;

    }

测试方法要进行try{…}catch{…}捕获异常处理

    public void testDiv() {

        int result = 0;

        try {

            result = cal.div(4, 2);

        } catch (Exception e) {

            e.printStackTrace();

            Assert.fail();// 测试除数非0情况下捕捉到异常,测试失败

        }

        Assert.assertEquals(2, result);

        // System.out.println("testDiv() invoke");

    }

    /**

     * 测试0作除数的情况

     */

    public void testDivByZero() {

        try {

            cal.div(4, 0);

            Assert.fail();// 测试0作除数的情况,若能到达以一步,说明上一步没抛出异常,测试失败

        } catch (Exception e) {

            // e.printStackTrace();

            Assert.assertEquals("除数不能为0!", e.getMessage()); //对捕获到的异常断言

        }

        // System.out.println("testDiv() invoke");

    }

单元测试是用来判断程序的执行结果与预期的结果是否一致,通过Assert的参数类型不同的重载方法assertEquals(expected, actual), assertTure(actual), assertFalse(actual), assertNull(actual)等断言方法进行断言,判断被测试的方法返回结果actual是否符合预期的结果。So,单元测试不是证明你是对的,而只是证明没有错误。

展示代码已推送到github 戳此获取代码

关于junit鄙人推荐一本书:Junit in action(有中文版)

关于单元测试,还有一种测试方法:TestNG     有兴趣的可以搜搜看看。

keep the bar green to keep the code clean——Junit详解(一)的更多相关文章

  1. keep the bar green to keep the code clean——Junit详解(二)

    测试用例&测试套件 举个栗子: 编写MyStack类模拟栈,并对其进行测试用例编写测试: 编写文件删除方法,并对其删除测试. 不再做演示,戳此获取代码 MyStack类: public cla ...

  2. junit单元测试(keeps the bar green to keeps the code clean)

    error是程序错误,failure是测试错误. junit概要: JUnit是由 Erich Gamma (设计模式的创始人)和 Kent Beck (敏捷开发的创始人之一)编写的一个回归测试框架( ...

  3. 单元测试JUnit 4(二)——keeps the bar green to keeps the code clean

    1.Failure和Error Failure是指测试失败  Error是指测试程序本身出错  (int a=10/0) 2.JUnit常用注解 2.1 @RunWith: 可以更改测试运行器(继承o ...

  4. 单元测试JUnit 4 (一)——keeps the bar green to keeps the code clean

    1. 导读 Junit是一个可编写重复测试的简单框架,是基于Xunit架构的单元测试框架的实例.Junit4最大的改进是大量使用注解(元数据),很多实际执行过程都在Junit的后台做完了,而且写tes ...

  5. [转]OAuth 2.0 - Authorization Code授权方式详解

    本文转自:http://www.cnblogs.com/highend/archive/2012/07/06/oautn2_authorization_code.html I:OAuth 2.0 开发 ...

  6. 【转】Code First 属性详解

    下面解释每个配置的作用 Table :用于指定生成表的表名.架构信息. Column :用于指定生成数据表的列信息,如列名.数据类型.顺序等. Key :用于指定任何名称的属性作为主键列并且默认将此列 ...

  7. OAuth 2.0 - Authorization Code授权方式详解

    I:OAuth 2.0 开发前期准备 天上不会自然掉馅饼让你轻松地去访问到人家资源服务器里面的用户数据资源,所以你需要做的前期开发准备工作就是把AppKey, AppSecret取到手 新浪获取传送门 ...

  8. iOS Code Signing: 解惑详解

    iPhone开发的代码签名 代码签名确保代码的真实以及明确识别代码的来源.在代码运行在一个开发系统以前,以及在代码提交到Apple发布以前,Apple要求所有的的应用程序都必须进行数字签名.另外,Ap ...

  9. VS Code 使用教程详解

    一.写在前面 1.为什么选择 \(VS\) \(code\) 一款非常好用的代码编辑器 标准化 \(Language\) \(Service\) \(Protocol\) 内置调试器和标准化 \(De ...

随机推荐

  1. Django 1.10 找不到静态资源解决方法

    测试版本:Django 1.10 问题:Django项目找不到静态资源 解决方法: 1.首先你需要在自己的app下面创建2个目录 static 和  templates 树形结构如下(DjangoPr ...

  2. 微信小程序-视图条件渲染

    条件渲染 wx:if 在框架中,我们用 wx:if="{{condition}}" 来判断是否需要渲染该代码块: <view wx:if="{{condition} ...

  3. 使用注解方式生成Hibernate映射文件

    @Entity:表示是一个hibernate的实体类 @Table:表示实体类和表的对应关系 @Id:表示是数据库中的主键 @Column:在数据表中描述的对应的列的信息 属性名是根据get方法,数据 ...

  4. 【Android】解决新建的xml文件无法正常加载的问题

    新建一个xml布局文件,如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xm ...

  5. [bzoj3192][JLOI2013]删除物品(树状数组)

    3192: [JLOI2013]删除物品 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 872  Solved: 508[Submit][Status ...

  6. iOS - QRCode 二维码

    1.QRCode 在 iOS7 以前,在 iOS 中实现二维码和条形码扫描,我们所知的有,两大开源组件 ZBar 与 ZXing. 这两大组件我们都有用过,这里总结下各自的缺点: 1.ZBar 在扫描 ...

  7. JS原型的问题Object和Function到底是什么关系

    var F = function(){}; Objcert.prototype.a = function(){}; Function.prototype.b = function(){}; F 既能访 ...

  8. unity-点乘和叉乘的应用

    http://blog.csdn.net/oskytonight/article/details/38900087 点乘:两个向量点乘得到一个标量 ,数值等于两个向量长度相乘后再乘以二者夹角的余弦值 ...

  9. Mysql 启动错误:the server quit without updating pid

    接到任务看看mysql为啥起不来,就上服务器上看了看,确实起不来,至于之前发生了啥也不知道. 服务器Ubuntu,mysql-5.6 1.先试下mysql登陆 mysql -uroot -p 发现报错 ...

  10. Attendance

    1.打怪 福利好美味(色.... 努力是为了,遇到你时,可以不用因为种种而错过. 一公司的老板对一位职员说:“我出10万买你的老婆,你卖吗?” 职员微笑着说:“那我出15万买你老婆,你同意吗?” 老板 ...