junitマルチポリシーテスト切り替え

3706 ワード

紹介する


最近、ユニットテストでは、ベースバージョンのテストは基本的に書かれていますが、高度なバージョンのテストが欠けています.コードcopyを1部も使いたくありません.ベースバージョンと高度なバージョンのテストの多重化をその場で実現するには、構成からテストポリシーを読み取り、現在のテストポリシーを指定する必要があります.基礎版と上級版はほとんどの機能が悪いだけなので、現在のテストメソッドまたはテストクラスが現在のテストポリシーで実行されているかどうかを注釈で限定する必要があります.次はくだらないことを言わないで、Let's Go!

じっこう


以前もjunitに深く入り込んでいませんでしたが、よく考えてみると、私たちは以下の2点をしなければなりません.
1.現在のテストクラスまたはテストメソッドが実行されるかどうかを注記で定義する必要があります.これはCategory注釈を用いて実現できるが,Categoryの役割はあまりにも簡単で,テストが実行されるかどうかを限定するしかない.
2.同一の試験方法に対して、異なる試験ポリシーの下で異なる処理を行うことができ、その中で要求アドレスが異なり、結果が返され、断言処理が異なるなどである可能性がある.これまで最初に考えたときは複雑すぎて、カスタム注釈を実現しようとしたが、aopブロックで要求パラメータと処理フローを書き換えた.これは複雑すぎて、異なるテストポリシーが同時に実行されません.最後の方法は、テストプロセスをインタフェースに抽出し、それぞれのテストポリシーを自分で実現し、初期化時に現在のテストポリシーに基づいて対応するインスタンスをバインドし、テスト使用時にインタフェースを直接使用すれば、マルチポリシーテストの切り替えを実現することができ、第1点と結びつけて基本的に需要を満たすことができる.
主なコードは次のとおりです.
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パラメータを渡す必要がありますが、実際には複数のポリシーであってもよいです.通常、コマンドラインを使用して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.完全なコード