LINUX.ORG.RU
решено ФорумAdmin

Запуск тестов

 ,


0

1

Подскажите как запускать все тесты с суффиксом .test в каталоге в алфавитном порядке и прекращать это делать, если какой-то тест вернёт не нулевой код возврата.

Т.е. test1.test, test2.test, test3.test test4.test следует запускать так:

test1.test
Завершился с кодом 0?
Да -> Надо запустить test2.test

test2.test
Завершился с кодом 0?
Да -> Надо запустить test3.test

test3.test
Завершился с кодом 0?
Нет -> Завершить процесс

Нужно реализовать с помощью bash. Желательно в 1 команду, чтобы в makefile вставить красиво.

Одна неонка советует:

Для решения этой задачи вам потребуется использовать цикл и условные операторы в bash. Например, вы можете воспользоваться следующей командой в makefile:

tests:
    for test_file in $$(ls -1v *.test); do ./$$test_file; [ $$? -eq 0 ] || exit 1; done

Объяснение:

  1. for test_file in $$(ls -1v *.test); do - это начало цикла, который перебирает все файлы с расширением .test в алфавитном порядке (с помощью ключа -v в команде ls, который сортирует файлы по имени).

  2. ./$$test_file - это команда для запуска каждого тестового файла.

  3. [ $$? -eq 0 ] || exit 1; - это условие проверки кода возврата последней команды (тестового файла). Если код возврата равен 0 (тест завершился успешно), то продолжается выполнение следующего тестового файла. В противном случае (код возврата не равен 0), процесс завершается с кодом возврата 1.

Вы можете вставить эту команду в свой makefile и вызвать цель tests для запуска всех тестов в алфавитном порядке, прекращая выполнение, если какой-либо из тестов вернет не нулевой код возврата.

vvn_black ★★★★★
()
ls -v -- *.test | while read fn; do if ! "./$fn"; then break; fi; done

Варианты с for fn in `ls` не подходят т.к. сломаются если в имени какого-нить файла будет пробел.

И не суй свой баш (не путать с posix шеллом /bin/sh) в мейкфайл, это нубство.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от vvn_black

который перебирает все файлы с расширением .test в алфавитном порядке
(с помощью ключа -v в команде ls, который сортирует файлы по имени)

Вот только -v - это не по алфавиту, а комплексная сортировка, где буквы по алфавиту, а цифры - по получаемым числам, то есть по версиям.

vodz ★★★★★
()
Ответ на: комментарий от firkax

Варианты с for fn in ls не подходят т.к. сломаются если в имени какого-нить файла будет пробел.

Если ls в двойных кавычках то не ломается:

$ touch a
$ touch 'b c'
$ for n in "$(ls -1v)"; do echo "$n"; done
a
b c
No
()
Ответ на: комментарий от vvn_black

А вот что Bard предложил причем сразу в Markdown.

Хорошо бы добавить автоматические комментарии от чатгпт и барда хотя бы в Development 😀


Конечно, вот команда bash, которая запускает все тесты с суффиксом .test в каталоге в алфавитном порядке и прекращает это делать, если какой-то тест вернёт не нулевой код возврата:

for test in *.test; do
  if ! ./$test; then
    echo "Test $test failed!"
    exit 1
  fi
done

Эта команда сначала создаёт список всех файлов с суффиксом .test в текущем каталоге. Затем она циклически проходит по списку файлов и запускает каждый файл. Если какой-то файл вернёт не нулевой код возврата, команда выведет сообщение об ошибке и завершится.

Чтобы вставить эту команду в makefile, вы можете использовать следующую строку:

test:
  for test in *.test; do
    if ! ./$test; then
      echo "Test $test failed!"
      exit 1
    fi
  done

Эта строка создаёт цель с именем test. Цель test будет выполнена, когда вы запустите команду make test. Цель test запускает все тесты в каталоге и прекращает это делать, если какой-то тест вернёт не нулевой код возврата.

alx777 ★★
()