参数化测试 junit_使用JUnit 5进行更清洁的参数化测试
參數化測試 junit
參數化單元測試的總體思路是對不同的數據運行相同的測試方法。 在JUnit 4中創建參數化測試遠非完美。 現有體系結構存在許多問題:將參數定義為類字段,并需要使用構造函數來創建它們,參數化和非參數化測試不能混合在一個測試類中,并且內置數據源非常有限。 幸運的是,所有這些都在JUnit 5中得到了改進!
注意:作為JUnit 4參數化測試的替代方法,您可以使用JUnitParams庫來解決我提到的許多問題(請在此處查看有關JUnitParams的博客文章: http : //blog.codeleak.pl/2013/12/parametrized-junit- tests-with.html )。
如何開始?
要開始在Junit 5中進行參數化測試,您需要向項目中添加所需的依賴項:向項目添加org.junit.jupiter:junit-jupiter-params:${junitJupiterVersion}依賴項以使用參數化測試,參數提供程序和轉換器。
SUT –被測系統
我創建的所有示例都在測試FizzBu??zz類:
public class FizzBuzz {private static final int THREE = 3;private static final int FIVE = 5;public String calculate(int number) {if (isDivisibleBy(number, THREE) && isDivisibleBy(number, FIVE)) {return "FizzBuzz";}if (isDivisibleBy(number, THREE)) {return "Fizz";}if (isDivisibleBy(number, FIVE)) {return "Buzz";}return String.valueOf(number);}private static boolean isDivisibleBy(int dividend, int divisor) {return dividend % divisor == 0;} }盡管FizzBu??zz非常簡單,但是它也可以用于演示更高級的單元測試技術,例如實現參數化測試。
我在JUnit 5中的第一個參數化測試
要在JUnit 5中創建參數化測試,請使用@org.junit.jupiter.params.ParameterizedTest (而不是@Test )注釋測試方法,并提供參數來源:
@ParameterizedTest(name = "{index} => calculate({0})") @ValueSource(ints = {1, 2, 4, 7, 11, 13, 14}) public void returnsNumberForNumberNotDivisibleByThreeAndFive(int number, TestInfo testInfo) {assertThat(fizzBuzz.calculate(number)).isEqualTo("" + number); }注釋具有可選的name屬性,用于自定義調用顯示名稱。 可用的模板變量:{index}->當前調用索引(從1開始),{arguments}->完整的,用逗號分隔的參數列表,{0},{1},…->一個單獨的參數。
在此示例中, @org.junit.jupiter.params.provider.ValueSource提供對整數文字值數組的訪問。 必須在此批注中提供一種輸入類型(字符串,實例,長整型或雙精度型)。
我還提供了由org.junit.jupiter.api.extension.ParameterResolver解析的其他參數。 請注意,由參數源解析的方法參數需要在參數列表中排在首位。
更多論點來源
@MethodSource
@ParameterizedTest(name = "{index} => calculate({0})") @MethodSource(names = {"divisibleByThree", "divisibleByThreeButNotFive"}) void returnFizzForNumberDivisibleByThree(int number) {assertThat(fizzBuzz.calculate(number)).isEqualTo("Fizz"); }@org.junit.jupiter.params.provider.MethodSource引用返回自變量源的方法(1個或更多)。 在此示例中,有兩種方法:
private static Stream<Integer> divisibleByThree() {int[] ints = new int[]{18, 21};return Stream.of(3, 6, 9, 12); }// The returned array will be converted to a Stream private static String[] divisibleByThreeButNotFive() {return new String[]{"18", "21"}; }提供參數的方法必須是靜態的,不能包含任何參數,并且必須返回Stream,Iterable,Iterator或數組。 您可能會注意到, divisibleByThreeButNotFive()方法返回一個字符串數組。 由于內置了隱式參數轉換器,因此可以很好地工作。 當參數源是CSV時(這在下面有更多說明),這確實很有用。 此外,可以使用自定義參數轉換器來轉換參數。
要解析多個參數,方法源將返回org.junit.jupiter.params.provider.Arguments實例流( org.junit.jupiter.params.provider.ObjectArrayArguments ):
@ParameterizedTest(name = "{index} => calculate({0}) should return {1}") @MethodSource(names = {"fizzBuzz"}) void fizzBuzz(int number, String expectedResult) {assertThat(fizzBuzz.calculate(number)).isEqualTo(expectedResult); }private static Stream<Arguments> fizzBuzz() {return Stream.of(ObjectArrayArguments.create(1, "1"),ObjectArrayArguments.create(2, "2"),ObjectArrayArguments.create(3, "Fizz"),ObjectArrayArguments.create(4, "4"),ObjectArrayArguments.create(5, "Buzz"),ObjectArrayArguments.create(6, "Fizz"),ObjectArrayArguments.create(7, "7"),ObjectArrayArguments.create(8, "8"),ObjectArrayArguments.create(9, "Fizz"),ObjectArrayArguments.create(15, "FizzBuzz")); }@CsvFileSource
提供參數源的另一種非常有趣的方法是org.junit.jupiter.params.provider.CsvFileSource ,它從類路徑中的多個CSV文件之一中提供參數:
@ParameterizedTest(name = "{index} => calculate({0}) should return {1}") @CsvFileSource(resources = {"/fizzbuzz/fizzbuzz_1.csv", "/fizzbuzz/fizzbuzz_2.csv"}, delimiter = ';') void fizzBuzzCsv(int number, String expectedResult) {assertThat(fizzBuzz.calculate(number)).isEqualTo(expectedResult); }其他論點
- @EnumSource提供了使用Enum常量的便捷方法。
- @CsvSource允許您將參數列表表示為以逗號分隔的值
- @ArgumentsSource可用于指定自定義,可重用的參數提供程序。
享受JUnit 5中的參數化測試!
資源資源
可以在GitHub上找到本文中介紹的所有示例: https : //github.com/kolorobot/unit-testing-demo
查看官方的JUnit 5文檔以了解更多信息: http : //junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests
翻譯自: https://www.javacodegeeks.com/2017/06/cleaner-parameterized-tests-junit-5.html
參數化測試 junit
總結
以上是生活随笔為你收集整理的参数化测试 junit_使用JUnit 5进行更清洁的参数化测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 买手机主要看什么
- 下一篇: stringbuffer_StringB