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