Автоматизированное тестирование с использованием make-файла - PullRequest
0 голосов
/ 20 января 2019

Я чрезвычайно новичок в make-файлах и просто провел целый день, пытаясь понять, как автоматизировать мое тестирование. Для этого проекта у меня есть одна программа, main.c, и она принимает в качестве параметров входной и выходной файл. Входной файл имеет форму «test- {filler} .txt», поэтому файл примера может быть «test-invalid-opcode.txt». Выходной файл будет иметь форму "out- {filler} .txt", поэтому он будет иметь форму "out-invalid-opcode.txt". Затем я хотел бы сравнить вывод с правильным выводом, сохраненным в "correct- {filler} .txt", так что это будет "correct-invalid-opcode.txt". Поэтому каждый тест будет иметь вход, выход и правильный вывод. Я хотел бы проверить, имеют ли выходные данные и правильный вывод какие-либо различия, и я хотел бы, чтобы это выполнялось на каждом тестовом файле с префиксом «test-». Я прочитал много спецификаций make-файла и много разных примеров, но я действительно не понимаю, как с этим справиться. Любая помощь будет очень признательна.

Вот что мне нужно для запуска одного теста:

CC=gcc
CFLAGS=-o

main.o: main.c
    $(CC) $(CFLAGS) main.o $<

.PHONY: test
test: main.o test-provided.txt test-out.cs
    ./program test-provided.txt test-out.txt
    diff -q test-out.txt out-provided.txt

Макет того, что я хочу, чтобы автоматический тест был что-то вроде

.PHONY: autotest
autotest: program
    $(foreach <file with "test-" prefix> run:
        main.o <test-name> <out-name>
        diff -q <correct-name> <out-name>

Но я действительно заблудился о том, как это осуществить.

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

Изменить, чтобы показать рабочую окончательную версию:

program: main.c
$(CC) $(CFLAGS) $a $<

TEST_INPUTS := $(wildcard test-*.txt)
.PHONY: autotest $(TEST_INPUTS)

autotest: $(TEST_INPUTS)

$(TEST_INPUTS): test-%.txt: program
    echo '' > out-$*.txt
    ./$< $@ out-$*.txt
    diff -q correct-$*.txt out-$*.txt

1 Ответ

0 голосов
/ 21 января 2019

Вообще, использование циклов с make не очень "придирчиво". Makefile - это целый язык, основанный на итерации и рекурсии, поэтому попытка выполнить «дополнительную» итерацию внутри рецепта часто избыточна.

Если вам нужно что-то перебрать, большинство , особенно , когда это что-то - файлы, вы должны попытаться работать с make, используя преимущества его целевой / обязательной организации. Выше приведен алгоритм:

$(foreach <file with "test-" prefix> run:
    main.o <test-name> <out-name>
    diff -q <correct-name> <out-name>

, который идеально подходит для поведения по умолчанию. Чтобы перевести это в make-файл, вы пишете правило, которое вызывает одну итерацию цикла, а затем используете предварительные условия для его запуска для нужных вам файлов. Примерно так:

TEST_INPUTS := $(wildcard test-*.txt)
.PHONY: autotest $(TEST_INPUTS)

autotest: $(TEST_INPUTS)

$(TEST_INPUTS): test-%.txt: program
        $< $@ test-out.txt
        diff -q test-out.txt out-$*.txt

Мало того, что это гораздо более похоже на макет, но у него есть и другие преимущества: например, вы можете запустить make test-provided.txt, и он будет запускать только один тест вместо всех тестов.

Вы должны использовать статические правила шаблонов здесь не нормальные правила шаблонов, потому что .PHONY цели не могут работать с правилами шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...