Junit5, как правильно писать Parameterized Tests

java
Теги: #<Tag:0x00007f7b64c15ef8>

(Dmtry) #1

В общем стоит цель сделать парамметризированные тесты с и заодно пощупать Junit5. Но на самом деле не очень понятно как сделать гибкую параметризацию.
Необходимо запускать тесты с разными данными, для админа, пользователя, например.
Данные предполагается хранить в файлах.
Есть аннотация @CsvFileSource (resources = "/test-data.csv" )
все бы хорошо но эти файлы должны динамически подставляться. Например для тестов запущенных с тегом ‘admin’ должен погрузиться файл ‘admin-test-data.csv’ для запущенных тестов с тегом пользователь соответственно другой.
Кто нибудь пробовал? Это возможно динамически? Или только через ParameterResolver рефлексию и прочие дебри ?


QAweekly #47: динамическое тестирование Андроид приложений, Junit5 Parameterized, календарь тестировщика, 5 вызовов, передовые методы автоматизации.
(Vatslau) #2

если KISS:

создали провайдер(внутри фабрика объектов - из чего угодно)

@DisplayName("Ccc Fragments CRUD")
final class CccFragmentCrud extends BaseTestCcc {
  private static Stream<CccFragment> fragmentsParam() {
    return modelsProvider(OBJECTS_PATH_GENERATION_SRC, fileName).getFragments().stream();

присобачили к методу

@ParameterizedTest
@MethodSource("fragmentsParam")
@DisplayName("create Parametrized")
void a_createParametrized(CccFragment fragment) {
    ваш код
    
  }

(Сергей Кузьмин) #3

@DmtryJS
не вышел еще на JUNIT5 но только что проверил что в моем же проекте

@RunWith(JUnitParamsRunner.class)
public class FileParamsTest {
	private final String dataOpenOfficeParamFileName = "file:src/test/resources/data.ods";

	@Test
	@ExcelParameters(filepath = dataOpenOfficeParamFileName, sheetName = "", type = "OpenOffice Spreadsheet", debug = true)
	public void loadParamsFromFileOpenOfficeSpreadsheetUsingVariable(double rowNum,
			String keyword, double count) {
		dataTest(keyword, count);
	}

	private void dataTest(String keyword, double count) {
		assertThat(keyword, notNullValue());
		System.err.println(
				String.format("Search keyword:'%s'\tExpected minimum link count:%d",
						keyword, (int) count));
		assertThat("search", keyword, anyOf(is("junit"), is("testng"), is("spock"),
				is("whatever"), is("there is no such thing")));
		assertThat((int) count, greaterThan(0));
	}

работает :

Reading Open Office Spreadsheet: Employee Data
// это номер строки
Cell Value: "1.0" class java.lang.Double
Cell Value: "junit" class java.lang.String
Cell Value: "202.0" class java.lang.Double
Cell Value: "2.0" class java.lang.Double
Cell Value: "testng" class java.lang.String
Cell Value: "52.0" class java.lang.Double
Cell Value: "3.0" class java.lang.Double
Cell Value: "spock" class java.lang.String
Cell Value: "22.0" class java.lang.Double

|Search keyword:'junit'|Expected minimum link count:202|
|---|---|
|Search keyword:'testng'|Expected minimum link count:52|
|Search keyword:'spock'|Expected minimum link count:22|

не знал что это тупик - попытка хоть как инициализировать
dataOpenOfficeParamFileName даже присвоить из другого класса

[ERROR] /junitparams/FileParamsTest.java:[146,37] element value must be a constant expression


:frowning:

то есть я не могу даже сделать отдельный класс для хранения


public class ParamDataUtils {

	public final static String testDataPath = "file:src/test/resources/data.json";

когда

private final static String testDataPath = ParamDataUtils.testDataPath;

или

	public static String param() {
		return "file:src/test/resources/data.json";
	}

то компайлер не дает это собрать…
Могу конечно в самом ExcelParametersProvider делать что хочу - класс мой собственный что хочу то и делаю - могу приделать пример …


(Сергей Кузьмин) #4

так что если нужнло для дела - хватайте HEAD (и тег наверное будет а потом надо наверное убрать):

public class ExcelParametersProvider
		implements ParametersProvider<ExcelParameters> {

	private final static String testEnvironment = (System
			.getenv("TEST_ENVIRONMENT") != null) ? System.getenv("TEST_ENVIRONMENT")
					: "";

ну и после

		if (testEnvironment != null && testEnvironment != "") {
			if (protocol.matches("file")) {
				if (debug) {
					System.err.println(String.format("Amending the %s with %s", filename,
							testEnvironment));
				}
			}
			// Inject the directory into the file path
			String updatedFilename = filename.replaceAll("^(.*)/([^/]+)$",
					String.format("$1/%s/$2", testEnvironment));
			filename = updatedFilename;
		}

и


copy src\test\resources\data.* src\test\resources\dev\
set  TEST_ENVIRONMENT=dev
mvn test

все работает как запланировано

Amending the src/test/resources/data.ods with dev
Reading Open Office Spreadsheet: Employee Data
Cell Value: "1.0" class java.lang.Double
Cell Value: "junit" class java.lang.String
Cell Value: "202.0" class java.lang.Double
Cell Value: "2.0" class java.lang.Double
..