Как программно добавить тест bats?

#bash #testing #integration-testing #bats-core

#bash #тестирование #интеграция-тестирование #bats-ядро

Вопрос:

Я хотел бы создать тест BATS для каждого файла в каталоге, но я не уверен, какой лучший способ сделать это. Приведенный ниже подход создает только один тест, даже если в каталоге много файлов.

 #!/usr/bin/env bats

for i in ./*;do
  @test "testing $i" {
    pwd
  }  
done
  

Ответ №1:

Когда тест выполняется BATS, файл сначала предварительно обрабатывается.1

Это заменяет @test блок фактической функцией и добавляет вызов этой функции.

Затем результат сохраняется в BATS_TMPDIR as bats.${PID}.src .

Любые программно добавленные тесты должны быть добавлены в предварительно обработанный файл.

Имена тестов также должны быть добавлены к BATS_TEST_NAMES ним .

Соединяя все это вместе, мы получаем: 2

 #!/usr/bin/env bats

declare sFile sSourceFile sTestFunction sTestName

readonly sSourceFile="${BATS_TMPDIR}/bats.$$.src"

if [[ -f "${sSourceFile}" ]];then
    for sFile in ./*;do
        sTestFunction="test_${sFile}"
        sTestName="Testing ${sFile}"

        cat <<EOT >> "${sSourceFile}"
            $sTestFunction() { bats_test_begin '$sTestName' 0;
                return 0
            }
            bats_test_function "${sTestFunction}"
EOT

        BATS_TEST_NAMES =("${sTestFunction}")
    done
fi

#EOF
  

Почему ваш пример не работает

Предварительно обработанная версия вашего примера выглядит следующим образом:

 #!/usr/bin/env bats

for i in ./*; do
test_testing_-24i() { bats_test_begin "testing $i" 4;
    pwd
  }
done

bats_test_function test_testing_-24i
  

Таким образом, тестовая функция объявляется столько раз, сколько присутствует файлов
. Однако функция test вызывается только один раз.3

Сноски

  1. https://github.com/bats-core/bats-core/wiki/Bats-Evaluation-Process
  2. Схема именования переменных, используемая в этом коде, является адаптацией системного венгерского языка, которая объясняется на http://blog.pother.ca/VariableNamingConvention /
  3. Решение, предложенное NAKAI, страдает от других проблем, вызванных тем же процессом.

Ответ №2:

Как насчет этого?

 #!/usr/bin/env bash

declare -r BATS=`mktemp`

trap "rm -f $BATS" EXIT

for i in $(ls)
do

cat > $BATS <<EOF
@test "testing $i" {
    pwd
}  
EOF

done

bats $BATS
  

Комментарии:

1. Если я выполню это, я получу сообщение об ошибке bats: unknown test name `test_testing_-24i'