У меня есть тестовый сценарий использования в ScalaTest, который включает в себя запуск одного и того же теста для подмножества файлов в каталоге, найденного через строку поиска. Я хотел бы иметь возможность использовать шаблонный класс, который считывает строку поиска из аргумента командной строки, обрабатывает строку поиска, чтобы найти соответствующий список файлов, а затем запускает такой же тест с другим именем для каждого из файлов.
Моя команда для запуска теста может выглядеть следующим образом
testOnly my.com.example.SnapshotTest -- -DfindTest=searchString
Затем я переопределил метод run
в FunSuiteLike
чтобы выполнить поиск, а затем вызвать метод суперзапуска
var testsToRun: Array[File] = null
override def run(testName: Option[String], args: org.scalatest.Args): Status =
{
var testSearchString: Option[String] = None
if (args.configMap.contains("findTest")) testSearchString = Option(args.configMap.getRequired[String]("findTest"))
testsToRun = findTestsFromSearchString(testSearchString)
superRes = super.run(testName, args)
}
До этого момента все работало нормально, и я могу собрать список файлов для обработки в переменной testsToRun
. Эта проблема появляется, когда я пытаюсь использовать этот список файлов для динамического построения тестов в классе:
testsToRun.foreach{ testName =>
test(s"first test on $testName")
{
println(s"running first test on $testName")
}
test(s"second test on $testName")
{
println(s"second test on $testName")
}
}
Когда код достигает этой точки, переменная testsToRun
равна нулю.
Другая попытка заключалась в том, чтобы обернуть весь вызов для проверки в метод, а затем вызвать метод в моем переопределенном методе run
, например:
def runTests()
{
testsToRun.foreach{ testName =>
test(s"all fields test $testName")
{
println(s"all fields test $testName")
}
test(s"min fields test $testName")
{
println(s"min fields test $testName")
}
}
}
Однако этот подход привел к ошибке : A test clause may not appear inside another test clause.
Итак, я ищу подход к динамическому названию и запуску тестов на основе результатов, полученных из аргумента командной строки.