1. 程式人生 > >IntelliJ IDEA單元測試+SpringMvc單元測試

IntelliJ IDEA單元測試+SpringMvc單元測試

Intellij idea + Junit 單元測試

原文連結:http://blog.csdn.net/u011138533/article/details/52165577

本文按以下順序講解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引數為負數沒有丟擲異常");

         然後說下timeout屬性,這個是用來測試效能的,就是測試一個方法能不能在規定時間內完成。
回到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;
}
        }
    }
}
      然後偶在測試類MathTest建立測試方法,隨機生成一個長度為50000的陣列然後測試排序所用時間。timeout的值為2000,單位和毫秒,也就是說超出2秒將視為測試不通過。
@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。       那怎麼辦,修改程式碼提升效能唄。回到Math方法改為下sort()。這次我用快速排序,程式碼如下:
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,就會發現,沒有被測試覆蓋到的程式碼都將高亮顯示為紅色。覆蓋的程式碼顏色則是綠色。如果一些程式碼是隻覆蓋部分,那沒將顯示為黃色。


Springmvc單元測試

原文連結:http://blog.csdn.net/sinat_28729797/article/details/50177083

若為Maven專案

1、首先得支援junit及spring-test jar包

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>

2、進行單元測試類配置

import org.junit.runner.RunWith;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml","classpath:springmvc-servlet.xml"})

public class UserTest extends AbstractJUnit4SpringContextTests{

           //注入測試類

            @Autowired
            private IUserDao userDao;

            @Resource(name = "userDaoImpl")
             public void setUserDao(IUserDao userDao) {
                this.userDao = userDao;
            }

          @Test
          public void testDoInsert() throws Exception {

           User user = new User();

           user.setId("...............")

          ......................

          //要測試的方法

          userDao.Insert(user);

          }

}

3、右鍵執行單元測試,就OK了


相關推薦

IntelliJ IDEA單元測試+SpringMvc單元測試

Intellij idea + Junit 單元測試 原文連結:http://blog.csdn.net/u011138533/article/details/52165577 本文按以下順序講解JUnit4的使用 下載jar包單元測試初體驗自動生成測試類執行順序@T

【轉載】IntelliJ IDEA配置JUnit進行單元測試

dbd ima pom.xml format height eight nsh 格式 oot 前提條件 安裝JDK,並配置好環境變量 工程已解決JUnit依賴關系(pom.xml) IDEA中JUnit配置 IDEA自帶一個JUnit插件,打開Settings窗口搜

IntelliJ IDEA找不到單元測試程式碼覆蓋率預設工具,沒有Coverage選項卡

1、我們使用Java開發工具IntelliJ IDEA,有時候使用單元測試工具Junit後,要進行程式碼覆蓋率報告輸出,可使用IDEA自帶的程式碼覆蓋率工具,直接測試類名右鍵Run ‘MyClassTest’ with Coverage或工具欄上的選項執行特定模式的測試,如下 2、但是發現

IntelliJ IDEA使用Junit進行單元測試

針對MAVEN工程中進行Junit進行單元測試 1、在src目錄先建立一個和main同等級的資料夾 2、然後右鍵test資料夾,設定為測試專用資料夾,然後在在下面建立一個java目錄路徑,根據main資料夾程式碼的路徑建立對用的多級目錄 3、然後進入類中建立對應的Test類 右鍵類名,進

intellij idea 自動生成test單元測試

在要測試的類上按快捷鍵ctrl + shift + t,選擇Create New Test,在出現的對話方塊的下面member內勾選要測試的方法,點選ok 或者點選選單欄Navigate–》test,選擇Create New Test,在出現的對話方塊的下面m

使用IntelliJ IDEA匯入storm-starter並測試WordCountTopology執行出現 A JNI error has occurred的原因和解決

第一次匯入storm包並測試WordCountTopology,出現如下截圖錯誤: 解決方法: 1.檢視POM檔案: 上圖的POM檔案中配置引數為:provided 應改為:compile 如下圖: 再次測試執行,ok了: "C:\Program Fil

SSM框架整合(IntellIj IDEA+Maven+Spring+SpringMVC+MyBatis)之MyBatis

我認為框架整合不熟練的話按照MyBatis->SpringMVC->Spring順序整合比較好,先配置MyBatis是因為不需要額外的配置伺服器,進行單元測試比較容易。Spring是用來進行整合的,所以等其它框架配置好之後進行整合不會顯得很亂。

IntelliJ IDEA新建一個springmvc專案並且匯入java包

1 新建一個spring專案 1 File => New => Project 2 新建spring mvc專案 配置名字SpringMvcDemo 3 匯入spring的jar包 4 這裡匯入spring-framework-4.1.6.RE

Intellij Idea-統一顯示SpringMVC請求和處理方法對映列表

前言 在SpringMVC中請求連結跟處理方法的對映關係因為@RequestMapping分佈在專案的各個方法上,所以不能像Struts那樣統一管理。 Intellij Idea提供了相關的支援; 新增支援 IDEA 控制檯下方預設有Spring

SSM框架整合(IntelliJ IDEA + maven + Spring + SpringMVC + MyBatis)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/P

搭建IntelliJ IDEA+maven+jetty+SpringMVC 開發環境(一)

以前一直使用的是eclipse,偶爾使用myeclipse,現在由於工作需要,正在使用idea。因為也是剛接觸這個開發工具,處於摸索階段,趁著學習寫了一篇環境搭建部落格,與大家一起分享一下。 一、新建專案 1、開啟idea工具,選擇新建專案file-> new -> project。選擇ma

IntelliJ IDEA建立Web SpringMVC專案(一):建立Maven Web專案

1.create project 2.選擇maven  web 3.groupid  artifactId設定 4.設定maven  Properties中新增一個引數archetypeCatalog=internal,不加這個引數,在maven生成骨架的時

IntelliJ IDEA 建立Spring+SpringMVC+mybatis+maven專案

第一步: 建立maven專案    輸入專案名和工程id    選擇maven    預設就可以了   剛開始時間比較長,可以看到,用了有7分多鐘, 還是很快的   maven包下載好後

Junit 單元測試intelliJ IDEA 中的安裝

repo setting 進入 安裝 junit sta rain pos 每次 1.為什麽使用Junit我們都知道,main 方法是一個程序的入口,通常來說,沒有main方法,程序就無法運行。我們經常會寫一些class文件(如下圖所示),他們並沒有自己的main方法。那麽

Intellij IDEA使用junit單元測試及其junit與spring版本不相容問題

下面是我在建立springboot測試類中的說明和遇到的問題 建立好了測試類後 1.測試service層測試類需要加上註解:@Runwith,@SpringBootTest 2.測試Contro

初識IntelliJ IDEA下JUnit單元測試

由於之前進行單元測試時,沒有用JUnit測試框架,逐步接觸到其後,它的功能實在是太強大了。本文主要初步介紹如何在IntelliJ IDEA上簡單使用JUnit。在Android Studio上建立module時,會自動幫助我們建立測試類: 下面也按照此在Intell

Intellij idea如何做單元測試 JUnit3

1,使用預設引數新建一個maven工程,工程目錄如下圖所示: 2,在pom.xml中新增依賴: <dependency> <groupId>junit</groupId>

SpringMVC 單元測試

-a 自動 art num number .class 進行 啟動服務 bsp 參考鏈接:https://blog.csdn.net/bestfeng1020/article/details/70145433 用Spring管理的項目,在不啟動服務的情況下進行測試類測試:@

MockMvc - SpringMVC單元測試的獨立測試

大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油,這個公眾號已經接入圖靈 ​    一、簡介 為何使用MockMvc?         對模組進行整合測試時,希望能夠通過輸入URL

MockMvc詳解——SpringMVC單元測試

★  MockMvc - SpringMVC單元測試的獨立測試: 一、簡介 為何使用MockMvc?         對模組進行整合測試時,希望能夠通過輸入URL對Controller進行測試,如果通過啟動伺服器,建立http client進行測試,這樣會使得測試變得很麻煩