junit 多策略測試切換

介紹

最近在弄單元測試,之前基礎(chǔ)版本的測試基本都是寫好的,但是缺少高級版本的測試,又不想把代碼copy一份,要就地實現(xiàn)基礎(chǔ)版和高級版的測試復(fù)用,并且需要從配置讀取測試策略來指定當(dāng)前測試策略。因為基礎(chǔ)版和高級版只是大部分功能差不多,因此還要做到通過注解的方式來限定當(dāng)前測試方法或測試類是否運行于當(dāng)前測試策略。下面廢話少說,Let's Go!

實踐

之前也沒有好好深入junit,仔細(xì)想了一下,我們要做到以下兩點:

1.需要做到通過注解限定當(dāng)前測試類或測試方法是否執(zhí)行。這個使用Category注解可以實現(xiàn),但是Category的作用太過于簡單,僅僅只能做到限定測試是否執(zhí)行。

2.需要做到針對同一測試方法在不同測試策略下可以有不相同的處理,其中可能請求地址不一樣,返回結(jié)果以及斷言處理不一樣等。這個之前最初考慮的時候太過于復(fù)雜,當(dāng)時想實現(xiàn)自定義注解,然后通過aop攔截去改寫請求參數(shù)和處理流程。這樣做太過于復(fù)雜,而且不同測試策略不會同時運行。最后的做法就是將測試流程提取到接口,各自的測試策略自己去實現(xiàn),然后在初始化時,根據(jù)當(dāng)前測試策略去綁定對應(yīng)的實例,測試使用時直接使用接口就可以實現(xiàn)多策略測試的切換,再結(jié)合第一點基本上就可以滿足需求了。

主要代碼如下:

package com.lux.junit;

import com.lux.junit.category.BasicCategory;
import com.lux.junit.category.SeniorCategory;
import com.lux.junit.helper.BaseUserHelper;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class JunitApplicationTests {

    @Autowired
    private BaseUserHelper userHelper;

    @Test
    public void contextLoads() {
    }

    @Test
    @Category({BasicCategory.class, SeniorCategory.class})
    public void getUserTest() {
        System.out.println(userHelper.getUser());
    }

    @Test
    @Category(SeniorCategory.class)
    public void getSeniorUserTest() {
        System.out.println(userHelper.getUser());
    }

}

package com.lux.junit.configure;

import com.lux.junit.category.BasicCategory;
import com.lux.junit.helper.BaseUserHelper;
import com.lux.junit.helper.BasicUserHelper;
import com.lux.junit.helper.SeniorUserHelper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created with IntelliJ IDEA.
 * User: chenfeilong
 * Date: 2018/1/28
 * Time: 23:30
 * Description:
 */
@Configuration
public class CategoryConfigure {
    @Value("${test.category}")
    String currentCategory;

    @Bean("userHelper")
    public BaseUserHelper userHelper() {
        if (BasicCategory.class.getName().equals(currentCategory)) {
            return new BasicUserHelper();
        } else {
            return new SeniorUserHelper();
        }
    }
}

最后

Category需要傳遞includeCategories參數(shù),其實它可以是多個策略。通常使用命令行傳入或使用gradle傳入。但是我們需要從配置文件讀入,需要像下面這樣做。

test {
    useJUnit {
        includeCategories getCategory()
    }
}

String getCategory() {
    def category = doGetCategory()
    println("current catagory: " + category)
    return category
}

String doGetCategory() {
    def propertiesFilePath = "src/main/resources/application.properties"
    def defaultCategory = "com.lux.junit.category.BasicCategory"
    File propFile = new File(propertiesFilePath)
    if (propFile.canRead()) {
        Properties props = new Properties()
        props.load(new FileInputStream(propFile))
        return props.getProperty("test.category")
    }
    println("can't find catagory config,use default catagory " + defaultCategory)
    return defaultCategory
}

參考目錄

1.junit wiki

2.完整代碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,553評論 19 139
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風(fēng)情閱讀 1,856評論 0 3
  • 提出一個好的問題,就已經(jīng)解決了問題的一半。 我們是誰、我們將去向何方、我們的溝通方式都反映著我...
    南昌拆書家向軍閱讀 4,136評論 0 1
  • 慢慢地把包從背上卸下來,然后緩緩地坐下,突然,這耀眼地光溫暖了我的視線,忍不住拍下來。不禁想作詩一首: 人生路慢慢...
    charming閱讀 173評論 0 0
  • ionic 不適用android4.1以下和ios6以下的版本 通過ionic serve啟動一個app,同時適應(yīng)...
    _陳慧敏閱讀 394評論 0 0

友情鏈接更多精彩內(nèi)容