初步认识JUnit

初步认识JUnit

  目前大多数的基于Java的企业应用软件,肯定少不了单元测试,程序员通过编写单元测试来验证自己程序的有效性;管理者通过持续自动的执行单元测试和分析单元测试覆盖率来确保软件本身的质量。可以说单元测试和集成测试在软件开发整个流程中占有举足轻重的地位。

    单元测试,是指对软件中的最小可测试单元进行检查和验证。单元测试不是为了证明程序是对的,而是证明程序没有错。Java常用的单元测试框架有JUnit,TestNG,还有些MOCK框架,这里我们只来讲述JUnit。

JUnit            

JUnit的两种版本是JUnit 3.8和JUnit 4,前者使用反射,后者使用反射和注解。

例子:
Calculator
 1 package com.shop.web.test;
 2 public class Calculator {
 3     private static double result = 0.0;
 4     public void add(double num) {
 5         result = result + num;
 6     }
 7     public void substract(double num) {
 8         result = result - num;
 9     }
10     public void multiply(double num) {
11         result = result * num;
12     }
13     public void divide(double num) {
14         if (num != 0) {
15             result = result / num;
16         } else {
17             result = result;
18         }
19     }
20     // 清零
21     public void clear() {
22         result = 0;
23     }
24     public double getResult() {
25         return result;
26     }
27 }

 CalculatorTest.java

 1 package com.shop.web.test;
 2 import junit.framework.TestCase;
 3 public class CalculatorTest extends TestCase {
 4     private static Calculator calculator = new Calculator();
 5     
 6     @Override
 7     protected void setUp() throws Exception {
 8         System.out.println("JUnit initialize the fixture state by overriding setup ");
 9         calculator.clear();
10     }
11     @Override
12     protected void tearDown() throws Exception {
13         System.out.println("JUnit clean-up after a test by overriding tearDown ");
14         calculator.clear();
15     }
16     public void testAdd() {
17         System.out.println("add result:" + calculator.getResult());
18         calculator.add(10.1);
19         assertEquals(10.1, calculator.getResult());
20     }
21     public void testSubstract() {
22         System.out.println("substract result:" + calculator.getResult());
23         calculator.add(10.1);
24         calculator.substract(2);
25         assertEquals(8.1, calculator.getResult());
26     }
27     public void testMultiply() {
28         System.out.println("multiply result:" + calculator.getResult());
29         calculator.add(12);
30         calculator.multiply(12);
31         assertEquals(144.0, calculator.getResult());
32     }
33     public void testDivide() {
34         System.out.println("divide result:" + calculator.getResult());
35         calculator.add(12);
36         calculator.divide(12);
37         assertEquals(1.0, calculator.getResult());
38     }
39 }

 绿条代表程序没有错误

 

使用JUnit3.8          
需要满足如下原则:
1、测试方法使用test作为方法名的前缀(JUnit设计 用反射找到以test开头的方法)
2、测试方法必须使用public void 进行修饰,不能带任何的参数
3、测试类和目标源代码的类应该位于同一个包下面,即包名应该一致
4、新建一个源代码目录来存放我们的测试代码,即源代码和测试代码分开
5、测试方法中间必须可以独立测试,测试方法之间不能有任何的依赖关系
测试类必须继承TestCase:
下面是TestCase的文档说明,junit.framework.TestCase
1 public abstract class TestCase extends Assert implements Test
2         A test case defines the fixture to run multiple tests.
3         To define a test case
4         1) implement a subclass of TestCase
5         2) define instance variables that store the state of the fixture
6         3) initialize the fixture state by overriding setUp
7         4) clean-up after a test by overriding tearDown.
8         Each test runs in its own fixture so there can be no side effects among test runs
1、测试类通过重写 TestCase的setUp()方法,用来初始化测试方法,即在每一个测试方法执行之前执行;
2、测试类通过重写 TestCase的tearDown()方法,用来清理测试方法产生的垃圾,即在每一个测试方法执行之后执行;
如:执行例子计算器test
 1 JUnit initialize the fixture state by overriding setup 
 2 add result:0.0
 3 JUnit clean-up after a test by overriding tearDown 
 4 JUnit initialize the fixture state by overriding setup 
 5 substract result:0.0
 6 JUnit clean-up after a test by overriding tearDown 
 7 JUnit initialize the fixture state by overriding setup 
 8 multiply result:0.0
 9 JUnit clean-up after a test by overriding tearDown 
10 JUnit initialize the fixture state by overriding setup 
11 divide result:0.0
12 JUnit clean-up after a test by overriding tearDown 

 

使用JUnit4.1            
需要满足如下原则:
1、@Test
与JUnit 3.8.1不同,在JUnit 4.1中不再强制要求方法名以test开头,而是允许随意命名,前提是没有继承TestCase,否则注解就不起作用了,其次只要符合Java的命名规范就行,但测试用例必须以@Test注解。
多个@Test没有明确的执行顺序,4.11版本MethodSorters可以定义执行顺序,如果你想要改变test的执行顺序,那么你可以简单的在test类上加以个注解@FixMethodOrder 并且指定一个合适的MethodSorters
@FixMethodOrder(MethodSorters.JVM) : 根据JVM返回的顺序来决定test方法的执行顺序。每次测试这个顺序可能都不一样
@FixMethodOrder(MethodSorters.NAME_ASCENDING) : 根据test方法名按照字典顺序升序排序
2、@Before和@After
JUnit3.8.1中的setUp和tearDown这两个方法,分别使用@Before和@After来进行注解,前者在每个测试方法开始之前执行,多用来做初始化;后者在每个测试方法完成之后执行,多用来清理资源。 注解必须用在public方法。
3、@BeforeClass和@AfterClass
JUnit 4.1还提供了@BeforeClass和@AfterClass注解,功能与@Before和@After类似,但前者是用在所有用例执行之前做初始化、之后做清理,而后者是在每个用例执行之前做初始化、之后做清理。注解必须用在public static方法
注意:前提是没有继承TestCase,否则注解就不起作用了,就必须使用test开头的方法。
 1 public class CalculatorTest4 {
 2     private static Calculator calculator = new Calculator();
 3     
 4     @Before
 5     public void setUp() throws Exception {
 6         System.out.println("JUnit initialize the fixture state by overriding setup ");
 7         calculator.clear();
 8     }
 9     @After
10     public void tearDown() throws Exception {
11         System.out.println("JUnit clean-up after a test by overriding tearDown ");
12         calculator.clear();
13     }
14     @Test
15     public void add() {
16         System.out.println("add result:" + calculator.getResult());
17         calculator.add(10.1);
18         assertEquals(10.1, calculator.getResult());
19     }

 4、@Test(expected=*.class)
在JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的类型,用来检查抛出预期异常。

1 @Test(expected=ArithmeticException.class)
2     public void divide(){
3         int i = 2/0;
4     }

5、@Test(timeout=xxx):
该元数据传入了一个时间(毫秒)给测试方法,
如果测试方法在制定的时间之内没有运行完,则测试也失败。

@Test(timeout=1)public void count(){for (int i = 0; i < 1000000000; i++) {System.out.println(i);}}

 

6、@ignore:
该元数据标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接, 而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试 方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。
1 @Ignore("此方法现在不需要")
2 @Test
3 public void ignore(){
4 System.out.println("不需要");
5 }

 

Spring整合JUnit          

 Junit测试Spring可以很方便的进行。 

用到jar包:spring-test-xxx.jar,junit4的jar。

需要注解 @RunWith、@ContextConfiguration

  @RunWith如:   @RunWith(SpringJUnit4ClassRunner.class)   //表示继承了SpringJUnit4ClassRunner

  @ContextConfiguration如: 用来加载Spring配置文件,@ContextConfiguration(locations = {"classpath:applicationContext-mybatis.xml",……"})

注意:(1)如果spring配置文件applicationContext.xml在classpath路径下,即通常的src目录下,这样加载配置文件,用classpath前缀。

     (2)但是在web项目中,有些人喜欢把spring配置文件applicationContext.xml放在WEB-INF目录下,这里不是classpath目录。这种情况可以按如下方式配置:用file前缀,指定配置文件的绝对路径。貌似这种方式不是很友好。 如:locations = { "file:D:\\workspace\\webproxy\\src\\main\\resources\\" + "applicationContext.xml" }

完整代码如下:

package com.shop.web.test;import java.util.Date;
import java.util.List;
import java.util.UUID;import javax.annotation.Resource;import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;import com.alibaba.fastjson.JSON;
import com.shop.web.entity.ShopUser;
import com.shop.web.service.ShopUserService;
import com.shop.web.util.DateUtil;
/*** service、dao层的测试类* @author ces**/
@RunWith(SpringJUnit4ClassRunner.class)//表示继承了SpringJUnit4ClassRunner类 
@ContextConfiguration(locations = {"classpath:applicationContext-mybatis.xml","classpath:applicationContext-service.xml","classpath:applicationContext-transaction.xml"})
public class ShopControllerTest {private static Logger logger = Logger.getLogger(ShopControllerTest.class);@Resourceprivate ShopUserService shopUserService;@Transactional@Testpublic void getShopUserById(){ShopUser shopUser = new ShopUser();shopUser.setUserid(6);shopUser.setUsername("zhangsan");shopUser.setPassword("333");shopUser.setCreateTime(Long.parseLong(DateUtil.getString(new Date(), DateUtil.YMDHMS)));try {shopUserService.insertSelective(shopUser);int i = 2/0;} catch (Exception e) {e.printStackTrace();logger.info("ShopControllerTest" + e);}logger.info(JSON.toJSONString("*********"));}
}

 

 

 

 

 

 

转载于:https://www.cnblogs.com/drubber/p/5791640.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32CubeMX使用方法及功能介绍

推荐 分享一个朋友的人工智能教程&#xff0c;零基础&#xff01;通俗易懂&#xff01;希望你也加入到人工智能的队伍中来&#xff01; http://www.captainbed.net/strongerhuang Ⅰ、写在前面 学习本文之前可以查看我前面的文章&#xff1a; STM32CubeMX介绍、下载与安装 主要…

2ab对应的c语言表达式是,编译原理 作业标准答案

《编译原理》第一次作业参考答案一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述)&#xff1f;1.b*(ab*ab*)*所有含有偶数个a的由a和b组成的字符串.2.c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)*答案一&#xff1a;所有至少含有1个a和1个b的由a&#xff0c;b和c组成…

Ext JS 6学习文档-第6章-高级组件

Ext JS 6学习文档-第6章-高级组件 高级组件 本章涵盖了高级组件&#xff0c;比如 tree 和 data view。它将为读者呈现一个示例项目为 图片浏览器&#xff0c;它使用 tree 和 data view 组件。以下是本章将要讨论的主题&#xff1a; TreesData views拖放图片浏览器 — 一个示例项…

android没有apk文件怎么打开方式,ios怎么打开apk文件,安卓无法打开apk文件

?  许多win7系统小伙伴在打开电脑中&#xff0c;经常会看到一些文件格式自己不知道是什么以及不知道要怎么打开&#xff0c;比如apk文件&#xff0c;APK是Android Package的缩写&#xff0c;即Android安装包&#xff0c;几乎所有的安卓应用程序都是这种格式&#xff0c;那么…

android屏幕基础知识

首先&#xff0c;先来上一张图&#xff0c;看看android屏幕分辨率的占比情况 什么是dp&#xff0c;dip&#xff0c;dpi&#xff0c;sp、px ?之间的关系是什么&#xff1f; px&#xff1a;构成图像的最小单位 dp/dip&#xff1a;密度无关像素 以160dpi为基准 1dp1px sp&#xf…

Android模糊查询excel文件内容,【excel】模糊查询关键字

求Excel大神指点迷津。如何批量模糊查找和替换。例如&#xff0c;A1&#xff1a;A100,每个单元格有一段文字。B1:B200,每个单元格有一个关键词。我的目的是在A1:A100中查找包含B1的单元格&#xff0c;找到后把这个单元格内容换成B1的内容。然后查找B2替换B2...一直到B200解决办…

日语的学习

1. 50 音图与假名 日本&#xff1a;に&#xff08;ni&#xff09;は&#xff08;ho&#xff09;ん&#xff08;nn&#xff09;谢谢&#xff1a;あ&#xff08;a&#xff09;り&#xff08;ri&#xff09;が&#xff08;ga&#xff09;と&#xff08;to&#xff09;う&#xff0…

android 翻转切换view,Android ViewFlipper翻转视图使用详解

简介ViewFlipper是Android自带的一个多页面管理控件且可以自动播放&#xff01;它和ViewPager有所不同&#xff0c;ViewPager继承自ViewGroup&#xff0c;是一页一页的&#xff0c;可以带动画效果&#xff0c;可以兼容低版本&#xff1b;而ViewFlipper继承ViewAnimator&#xf…

拓扑学初步

拓扑&#xff08;Topology&#xff09;原本是一个数学概念&#xff0c;描述的是几何图形或空间在连续改变形状后还能保持不变的性质。2016 年度的诺贝尔物理学奖颁给的三位物理学家&#xff0c;正是凭借他们在物理学中引入了拓扑的概念。0. 基本概念 & 定义 同胚&#xff1…

android 京东白条支付,京东网银钱包安卓版上线:整合京东白条和小金库

京东金融网银钱包移动版上线 京东账号可直接登录【TechWeb报道】4月1日消息&#xff0c;京东金融今日宣布网银钱包客户端正式在Android平台上线。网银钱包客户端近期也将登录苹果应用商店&#xff0c;用户使用京东账号将可以直接登录。据悉&#xff0c;网银钱包客户端是京东金融…

JSP知识点大致介绍1

解释&#xff1a;当jsp写好&#xff0c;运行服务器&#xff0c;还没有发出请求&#xff08;写网址按Enter&#xff09;&#xff0c;Tomcat的work下是没有字节码文件的。当写网址&#xff1a;localhost&#xff1a;8888/xxxx/index.jsp按Enter,运行后work下就有字节码文件了&…

发一则自己创作的Lae程序员小漫画,仅供一乐

转载于:https://www.cnblogs.com/aaqxhaa1979/p/5817650.html

Material Design控件使用学习 toolbar+drawerlayout+ Snackbar

效果 1.,导包design包和appcompat-v7 &#xff0c;设置Theme主题Style为NoActionbar 2.custom_toolbar.xml <?xml version"1.0" encoding"utf-8"?><android.support.v7.widget.Toolbar xmlns:android"http://schemas.android.com/apk/res/…

使用渐进式JPEG来提升用户体验

今天才认识到原来JPEG文件有两种保存方式他们分别是Baseline JPEG&#xff08;标准型&#xff09;和Progressive JPEG&#xff08;渐进式&#xff09;。两种格式有相同尺寸以及图像数据&#xff0c;他们的扩展名也是相同的&#xff0c;唯一的区别是二者显示的方式不同。 Baseli…

html英文读法,classin读音发音 classln英文怎么读?

classln英文怎么读?class in 读音&#xff1a; [klɑːs] [ɪn] class英 [klɑːs] 美 [kls] in英 [ɪn] 美 [ɪn] 重点词汇&#xff1a; class英 [klɑːs] 美 [kls] n. 等级&#xff1b;阶级&#xff1b;阶层&#xff1b;班级&#xff1b;课&#xff1b;v. 分类 过去式: cla…

季度报告 选择日期_易方达富惠纯债债券型证券投资基金 2018年第4季度报告

2018年12月31日基金管理人&#xff1a;易方达基金管理有限公司基金托管人&#xff1a;中国银行股份有限公司报告送出日期&#xff1a;二一九年一月二十二日1 重要提示基金管理人的董事会及董事保证本报告所载资料不存在虚假记载、误导性陈述或重大遗漏&#xff0c;并对其内容…

iscsi 同步_群晖六盘位旗舰NAS,一文教你如何解决多设备同步,跨平台协调

作为一名非专业后期狗来讲&#xff0c;一直以来在多设备以及不同平台间的数据同步&#xff0c;协同上都想尽了各种办法。众所周知&#xff0c;对于剪辑师来讲。对于工作平台都会有自己的偏好&#xff0c;比如有老师傅会喜欢Adobe的PR作为剪辑软件&#xff0c;90后的年轻人又觉得…

计算机内图标wps云盘怎么去掉,Win10资源管理器WPS云文档图标如何清除

如果用户在Windows10系统中安装了WPS办公软件的话&#xff0c;那么资源管理器中就会自动生成WPS云文档图标。一些用户觉得这样很占用空间&#xff0c;就希望该将其彻底删除。该如何操作呢&#xff1f;接下来&#xff0c;就随小编一起看看具体步骤吧&#xff01;具体如下&#x…

englishpod主持人对话文本_Englishpod 23 | 主持人文本讲解

本期主持人对话中的主要语言知识点如下&#xff1a;泛听&#xff1a;建议请先听了录音&#xff0c;没听清的&#xff0c;再对照看文本本期知识点&#xff1a;1&#xff0c;Vocabulary preview(词汇预览)&#xff1a;(1) financial adviser 2&#xff0c;Language takeaway(语言…

计算机桌面上的声音图标没了怎么办,Win7电脑右下角声音图标不见了怎么办?...

最近有Win7用户反映&#xff0c;电脑右下角的声音图标总是莫名其妙的不见了&#xff0c;导致用户要调整音量的时候不知道从哪调整&#xff0c;这让用户非常烦恼。那么&#xff0c;Win7电脑右下角声音图标不见了怎么办呢&#xff1f;下面&#xff0c;我们就一起往下看看Win7电脑…