Использование аргумента командной строки ScalaTest для создания динамически именованных тестов - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть тестовый сценарий использования в 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.

Итак, я ищу подход к динамическому названию и запуску тестов на основе результатов, полученных из аргумента командной строки.

...