1. 程式人生 > >JUnit 4的引數化測試

JUnit 4的引數化測試

最近在研究TestN與JUnit 4的優劣勢。在測試JUnit 4的@Parameters的時候,遇到initializationError的錯誤。所以,想徹底研究了一下這個問題出現的原因,並找出解決方法。

問題描述:

之前使用JUnit的時候,可以直接以JUnit test形式執行test類中某個用@Test註解的函式。但是如果test類中使用了@RunWith(Parameterized.class)註解,這種執行方法就會出現initializationError的錯誤。

被測試的類Math:

package com.ibm.junit.parameter;

/**
 * @author 
[email protected]
* */ public class Math { public static int divide(int x,int y) { return x/y; } public static int multiple(int x,int y) { return x*y; } }

測試的類MathTest:

package com.ibm.junit.parameter;

import static org.junit.Assert.assertEquals;

import java.util.Arrays;
import java.util.Collection;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
 * @author 
[email protected]
* */ @RunWith(Parameterized.class) public class MathTest { int faciend; int multiplicator; int result; @Parameters public static Collection multipleValues() { System.out.println("Initialize Data!"); return Arrays.asList(new Object[][] { {2, 3, 6 }, {3, 4, 12 }, {4, 5, 20 } }); } public MathTest(int faciend, int multiplicator, int result) { System.out.println("Constructor Method with no Parameters!"); this.faciend = faciend; this.multiplicator = multiplicator; this.result = result; } /*public MathTest() { System.out.println("Constructor Method with no Parameters!"); }*/ @BeforeClass public static void setUpBeforeClass() throws Exception { System.out.println("Before Class!"); } @AfterClass public static void tearDownAfterClass() throws Exception { System.out.println("After Class!"); } @Test(expected=ArithmeticException.class) public void testDivide() { System.out.println("Test Divide"); assertEquals(3,Math.divide(9,3)); assertEquals(3,Math.divide(10,3)); Math.divide(10,0);//除數不能為0,會丟擲異常 } @Test public void testMultiple() { System.out.println("Test Multiple"); assertEquals(result,Math.multiple(faciend,multiplicator)); } }


為了分析問題,做了如下對比試驗:

1. 直接以JUnit test形式執行MathTest類

    如果執行整個MathTest類,測試通過,輸出如下:

Initialize Data!
Before Class!
Constructor Method with no Parameters!
Test Divide
Constructor Method with no Parameters!
Test Multiple
Constructor Method with no Parameters!
Test Divide
Constructor Method with no Parameters!
Test Multiple
Constructor Method with no Parameters!
Test Divide
Constructor Method with no Parameters!
Test Multiple
After Class!

    如果執行MathTest類中的testMultiple()方法,測試通不過,提示initializationError的錯誤。

2. 註釋掉MathTest類前面的@RunWith(Parameterized.class),提示java.lang.Exception: Test class should have exactly one public zero-argument constructor。後面會詳細分析註釋@RunWith(Parameterized.class)前後的區別。

3. 根據2中提示的錯誤,註釋有參建構函式,提供無參建構函式。不管是對整個MathTest類進行JUnit測試,還是對testMultiple()方法進行JUnit測試,都會通過。

4. 加上MathTest類前面的@RunWith(Parameterized.class),仍然提供無參建構函式,對MathTest類和方法的測試,都通不過,提示java.lang.IllegalArgumentException: 引數數目錯誤。
 

通過上面的對比試驗,下面結合JUnit引數測試的原理,來分析一下原因。

對於JUnit引數化測試,需要在測試類前加上@RunWith(Parameterized.class)。@RunWith用來指定該類使用引數化執行器執行,而不是使用預設情況下的JUnit內建的執行器執行。沒有@RunWith註解,就是使用JUnit內建的執行器執行,它需要無參建構函式,可以不自己提供而使用預設無參建構函式。試驗3說明了這個問題。雖然測試通過,但是由於沒有對引數賦值,引數都是使用的預設值,所以是無效的測試。

使用@RunWith註解,就必須提供有參建構函式。試驗4說明了這個問題。並且,每個測試函式執行前,都會呼叫有參建構函式初始化所有測試資料和驗證資料。試驗1的輸出結果說明這個。

同時,使用@RunWith註解之後,就不能單獨對測試類中單個測試函式進行測試。因為單獨執行單個測試函式,不會在建立測試類前執行@Parameters註解的函式,不能為引數化測試提供引數,所以會提示initializationError的錯誤。如果對測試類進行測試,就會在建立測試類前準備好測試資料,然後在執行每個測試函式前通過建構函式為測試函式要用到的測試變數賦值。試驗1的輸出結果說明這個。

相關推薦

JUnit 實現引數測試

1.在類的上面實現註解 @RunWith(Parameterized.class) : 2.編寫一個執行引數化的方法 public static Collection<Object[]> data(){},此方法和迭代器是一樣的效果,會在每次呼叫test 方法的

JUnit 4引數測試

最近在研究TestN與JUnit 4的優劣勢。在測試JUnit 4的@Parameters的時候,遇到initializationError的錯誤。所以,想徹底研究了一下這個問題出現的原因,並找出解決方法。 問題描述: 之前使用JUnit的時候,可以直接以JUnit tes

JUnit四(引數測試

JUnit—引數化測試 一.概述 JUnit 4引入了一項名為引數化測試的新功能。引數化測試允許開發人員使用不同的值反覆執行相同的測試。建立引數化測試需要遵循五個步驟: 使用@RunWith(Parameterized.class)註釋測試類。 建立一個

JUnit自動化單元測試(五):引數測試

要成為JUnit測試高手必不可少的一項技能就是引數化測試了,現在有一個方法根據不同的引數會有不同的結果,為了測試全面如果把所有可能的情況都逐個寫出來測試一遍那未免太low了,此時就可以用引數化測試,舉個例子: package junit.demo; impor

junit 引數測試

在測試類上面加上註解@RunWith(Parameterized.class)(如果不是引數化測試則:@RunWith(PowerMockRunner.class))@PrepareForTest(BuildIncidentCfgServiceImpl.class)根據測試類

postman—筆記3.Collections/資料引數/測試報告

Collections 儲存: 資料引數化: 執行前可以進行預覽: csv檔案寫法: 測試報告: 一.需要安裝:             1.nodejs             2.npm→cnpm             3.ne

SpringBoot使用@RunWith(Parameterized.class)進行引數測試同時支援依賴注入,以及CommandLineRunner在單元測試時不執行主程序

問題提出 在使用SpringBoot進行單元測試的時候,我發現了兩個問題 使用引數化測試的時候,必須使用 @RunWith(Parameterized.class),而對Spring進行單元測試時,如果想使用依賴注入,即使用 @Autowired 註解,需要使

引數測試(Parameterized Test)

Junit 4 引數化測試 允許通過變化範圍的引數值來測試方法。引數擦測試可以通過以下簡單的步驟實現: 對測試類添加註解 @RunWith(Parameterized.class)。 將需要使用變化範圍引數值測試的引數定義為私有變數。 使用上一步驟宣告的私有變數作為入

TestNG引數測試之Excel讀取資料

1、新建Excel文件,準備好測試資料 在當前工程的resources目錄下,新建檔名為testdata的Excel文件 開啟Excel,將當前sheet重新命名為calculator,構造num1、num2、result三個引數資料 2、新建

junit5 入門系列教程-22-junit5 拓展實體-引數測試解決方案(Parameter Resolution)

目錄 ParameterResolver ParameterResolver 定義用於在執行時動態解析引數的擴充套件API。 如果測試建構函式或@Test、@RepeatedTest、@ParameterizedTest、@TestFactory

TestNg引數測試之讀取csv檔案

1、新建csv文件,準備好測試資料 在當前工程的resources目錄下,新建檔名為add的csv文件 開啟csv檔案,構造n1、n2、r1三個引數資料 2、新建一個CSVData類用來獲取csv檔案中的資料 package com.mc

Python unittest 引數測試

        最近在用Python自帶的unittest框架做測試,但發現此包不支援類似JUnit那樣的引數化測試功能。下面給出一簡單實現,就是效率和程式碼美觀程度差了點:) 約定         引數化case的名字必須以 "parameterized_" 為字首,後面

Junit4——測試套件的使用和引數測試

一,測試套件 @RunWith(Suite.class)/*使類成為測試套件的入口類*/ @Suite.SuiteClasses({TaskTest1.class,TaskTest2.class

.net持續整合測試篇之Nunit引數測試

系列目錄 在進行單元測試的時候,很多時候,很多時候我們都是在單元測試方法內部提供特定的值,但是這樣測試往往造成樣本數不足從而導致覆蓋的結果不夠全面,很多時候我們更想提供來自外部的,滿足條件的一組值來進行測試.其實Nunit框架本身提供了為測試用例提供值的能力.我們可以對它進行擴充套件來實現匯入外部的值來填

Python 中如何實現引數測試

Python 中如何實現引數化測試? 之前,我曾轉過一個單元測試框架系列的文章,裡面介紹了 unittest、nose/nose2 與 pytest 這三個最受人歡迎的 Python 測試框架。 本文想針對測試中一種很常見的測試場景,即引數化測試,繼續聊聊關於測試的話題,並嘗試將這幾個測試框架串聯起來,做一個

Jmeter 中 CSV 如何引數測試資料並實現自動斷言

      當我們使用Jmeter工具進行介面測試,可利用CSV Data Set Config配置元件,對測試資料進行引數化,迴圈讀取csv文件中每一行測試用例資料,來實現介面自動化。此種情況下,很多測試工程師只會人工地檢視響應結果來判斷用例是否通過。&nb

JUnit5學習之六:引數測試(Parameterized Tests)基礎

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ###

JUnit5學習之七:引數測試(Parameterized Tests)進階

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ###

Google單元測試框架gtest之官方sample筆記3--值引數測試

1.7 sample7--介面測試 值引數不限定型別,也可以是類的引用,這就可以實現對類介面的測試,一個基類可以有多個繼承類,那麼可以測試不同的子類功能,但是隻需要寫一個測試用例,然後使用引數列表實現對每個子類的測試。 使用值引數測試法去測試多個實現了相同介面(類)的共同屬性(又叫做介面測試) using