天天看點

junit依賴_JUnit和TestNG:Java單元測試架構

目前,常用的 Java 單元測試架構是 JUnit 和在 JUnit 基礎上進一步擴充的 TestNG。為了能很好地在 Maven 中完成測試案例的執行和形成測試報告,這裡介紹一下怎樣在 JUnit 和 TestNG 架構下編寫測試代碼。

JUnit 單元測試架構

JUnit 是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試架構,是一個開放源代碼的 Java 測試架構,可以在它的基礎上編寫和運作可重複的測試。JUnit 單元測試架構有如下幾個特點。

  • 使用斷言測試結果。
  • 能共享測試資料。
  • 友善注冊和運作測試。
  • 支援圖形化測試。

JUnit 單元測試架構的安裝比較簡單,隻需下載下傳 JUnit 的最新壓縮包在本地解壓後,配置好 JUNIT_HOME 環境變量,并且在 CLASSPATH 目錄中追加好 JUnit 的 jar 包就可以了。對于 IDE 環境的使用者,隻需将 JUnit 的 jar 包添加到項目的 build path 中就可以了。接下來回顧梳理(以前樣例中有編寫,隻是沒有系統介紹)一下怎樣在一個 Maven 項目中基于 JUnit 編寫測試案例。在 Maven 項目中,基于 JUnit 編寫測試案例一般要兩步:一是在 pom.xml 中添加 JUnit 依賴;二是基于 JUnit 規範編寫測試代碼。如下所示是 MvnSSMDemo.Service.Impl 項目中關于 JUnit 的配置。在 pom.xml 中的 JUnit 依賴配置。

<dependencies>    <dependency>        <groupId>cn.com.mvnssh.demogroupId>        <artifactId>MvnSSHDemo.DAOartifactId>        <version>0.0.1-SNAPSHOTversion>    dependency>    <dependency>        <groupId>cn.com.mvn.ssh.demogroupId>        <artifactId>MvnSSHDemo.ServiceartifactId>        <version>0.0.1-SNAPSHOTversion>    dependency>    <dependency>        <groupId>cn.com.mvn.ssm.demogroupId>        <artifactId>MvnSSMDemo.DAO.MyBatisartifactId>        <version>0.0.1-SNAPSHOTversion>        <scope>testscope>    dependency>dependencies>
           

TestUserServiceImpl.java 類代碼如下所示:

package cn.com.mvn.ssh.demo.service.impl;import java.util.List;import org.junit.After;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.com.mvn.ssh.demo.entity.MvnUser;import cn.com.mvn.ssh.demo.entity.Status;import cn.com.mvn.ssh.demo.service.IUserService;import junit.framework.Assert;public class TestUserServiceImpl {    private IUserService userService;    private ApplicationContext ctx = null;    @Before    public void init() {        this.ctx = new ClassPathXmlApplicationContext("applicationContext.xml");        this.userService = (IUserService) ctx.getBean("userService");    }    @Test    public void testCreateUser() {        MvnUser user = new MvnUser();        user.setUrAge(11);        user.setUrPassword("11");        user.setUrStatus(Status.ACTIVE.getStatus());        user.setUrUserName("service1");        this.userService.createUser(user);        MvnUser u = this.userService.searchUser("service1");        boolean bool = u != null && u.getUrAge() == 11 && u.getUrStatus().equals(Status.ACTIVE.getStatus());        Assert.assertTrue(bool);        // 删除使用者        this.userService.deleteUser(u.getUrId());    }    @Test    public void testEditUser() {        MvnUser user = new MvnUser();        user.setUrAge(11);        user.setUrPassword("11");        user.setUrStatus(Status.ACTIVE.getStatus());        user.setUrUserName("service1");        this.userService.createUser(user);        MvnUser u = this.userService.searchUser("service1");        this.userService.editUser(88, Status.INACTIVE.getStatus(), u.getUrId());        u = this.userService.searchUser("service1");        Assert.assertTrue(u.getUrAge() == 88 && u.getUrStatus().equals(Status.INACTIVE.getStatus()));        this.userService.deleteUser(u.getUrId());    }    @Test    public void testDeleteUser() {        MvnUser user = new MvnUser();        user.setUrAge(11);        user.setUrPassword("11");        user.setUrStatus(Status.ACTIVE.getStatus());        user.setUrUserName("service1");        this.userService.createUser(user);        MvnUser u = this.userService.searchUser("service1");        this.userService.deleteUser(u.getUrId());        MvnUser u2 = this.userService.searchUser(u.getUrId());        Assert.assertTrue(u != null && u2 == null);    }    @Test    public void testSearchUserById() {        MvnUser user = this.userService.searchUser(1);        Assert.assertNotNull(user);    }    @Test    public void testSearchUserByUserName() {        MvnUser user = this.userService.searchUser("zhangsan");        Assert.assertNotNull(user);    }    @Test    public void testSearchUsers() {        List userList = this.userService.searchUsers();        Assert.assertTrue(userList != null && userList.size() > 0);    }    @After    public void destory() {        this.userService = null;        this.ctx = null;    }}
           

pom.xml 中的 JUnit 依賴配置在這裡就不過多重複了,這裡主要說明測試代碼的注意事項。

1)在 Maven 項目中,測試代碼有專門的預設目錄:src/test/java。2)一般測試案例代碼的包與要測試的目标類的包一樣。3)測試代碼的類的命名一般是“Test+目标測試類的類名”。4)測試代碼中的方法有三種。

  • 使用 @Before 标記的,實作初始化執行測試代碼需要的資源。
  • 使用 @Test 标記的,跟測試目标類的每個方法一一對應的測試代碼。
  • 使用 @After 标記的,完成測試後需要釋放的資源。

5)測試方法的邏輯。

  • 準備好測試資料。
  • 根據測試工具和使用者需求(目标代碼的實作),确定期望結果。
  • 執行測試方法擷取實際結果。
  • 斷言實際結果是否同期望結果一緻。

TestNG測試架構

TestNG 是一個測試架構,也是一個開源的自動化測試架構。很多人把 TestNG 了解成 JUnit、特别是 JUnit4 的下一代。實際上它不隻是簡單擴充 JUnit,它是一個靈感源于 JUnit,目的是為了更優于 JUnit 的自動測試架構,跟 JUnit 是獨立的。TestNG 消除了大部分舊架構的限制,使開發人員能夠編寫更加靈活、更加強大的測試程式,而且很大程度上借鑒了 Java 注解,可以使測試代碼更好地同 Java 新特征整合。相對其他測試架構,TestNG 有如下自身的特點。

  • 使用簡單的注解說明測試方法。
  • TestNG 使用 Java 和面向對象程式設計。
  • 支援綜合測試。
  • 獨立的編譯時間、獨立的運作測試代碼的配置和資料。
  • 靈活的運作時配置。
  • 支援測試組設定和運作。
  • 支援依賴測試、并行測試、負載測試和局部測試。
  • 靈活的插件 API。
  • 支援多線程測試。

在 Maven 項目中編寫和運作 TestNG 是比較友善的。首先要移除以前在 pom 中配置的 JUnit 依賴,添加 TestNG 依賴,代碼如下所示。

<dependency>    <groupId>org.testnggroupId>    <artifactId>testngartifactId>    <version>5.9version>    <scope>testscope>    <classifier>jdk15classifier>dependency>
           

同 JUnit 類似,TestNG 的依賴範圍是 test。另外,TestNG 使用 classifier jdk15 和 jdk14 為不同的 Java 平台提供支援。接下來在測試代碼中将以前引用的 JUnit 的注解、類改成 TestNG 的。注解名稱和類名都一樣,隻是包名不同,常用的類如下。

  • org.testng.annotations.Test,測試方法的注解。
  • org.testng.annotations.BeforeMethod,測試方法運作前執行的方法注解。
  • org.testng.annotations.AfterMethod,測試方法運作後執行的方法注解。
  • org.testng.annotations.BeforeClass,所有測試方法運作前執行的方法注解。
  • org.testng.annotations.AfterClass,所有測試方法運作後執行的方法注解。
  • org.testng.Assert,斷言類。

同運作 JUnit 一樣,直接使用 mvn test 指令,Maven 會自動執行符合命名模式的測試類。TestNG 除了可以同 JUnit 一樣自動執行符合命名模式的測試類外,還可以通過 testng.xml 配置檔案需要運作的測試集合。例如,可以在 Maven 項目的根目錄下建立一個 testng.xml 檔案,代碼如下:

<?xml version="1.0" encoding="utf-8" ?><suite name="TestSuite" verbose="1">    <test name=”test1”>        <classes>            <class name="cn.com.mvn.demo.TestNGDemo"/>        classes>    test>suite>
           

同時,在 maven-surefire-plugin 中聲明 testng.xml,代碼如下:

<plugin>    <groupId>org.apache.maven.pluginsgroupId>    <artifactId>maven-surefire-pluginartifactId>    <version>2.16version>    <configuration>        <suiteXmlFiles>            <suiteXmlFile>testng.xmlsuiteXmlFile>        suiteXmlFiles>    configuration>plugin>
           

另外,TestNG 相對 JUnit 還有一個優勢,就是可以使用注解的方式對測試方法進行分組标記。在運作的時候可以指定隻執行哪個組的測試方法,或哪些組的測試方法,如下所示。

@Test{groups = {"group1","group2"}}

表示将對應的方法加入 group1 組和 group2 組。接下來,可以在 maven-surefire-plugin 插件中配置運作哪些組,代碼如下:

<plugin>    <groupId>org.apache.maven.pluginsgroupId>    <artifactId>maven-surefire-pluginartifactId>    <version>2.16version>    <configuration>        <groups>group1,group3groups>    configuration>plugin>
           

表示執行目前 TestNG 的時候,隻會執行 group1 和 group2 兩個組的測試方法。

junit依賴_JUnit和TestNG:Java單元測試架構