代码之家  ›  专栏  ›  技术社区  ›  Eric Wiener

使用makefile自动测试

  •  0
  • Eric Wiener  · 技术社区  · 7 年前

    我对生成文件非常陌生,只是花了一整天的时间来尝试如何实现测试的自动化。对于这个项目,我有一个程序main.c,它接受输入和输出文件作为参数。输入文件的格式为“test-filler.txt”,因此示例文件可能为“test invalid opcode.txt”。输出文件的格式为“out-filler.txt”,因此其格式为“out invalid opcode.txt”。然后我想将输出与保存在“correct-filler.txt”中的正确输出进行比较,因此这将是“correct invalid opcode.txt”。因此,每个测试都有一个输入、输出和正确的输出。我想检查输出和正确的输出是否有任何差异,我想在每个带有前缀“test-”的测试文件上运行这个。我通读了很多makefile规范和许多不同的例子,但是我真的很困惑如何处理这个问题。任何帮助都将不胜感激。

    以下是我必须运行的一个测试:

    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 回复  |  直到 7 年前
        1
  •  1
  •   MadScientist    7 年前

    通常,将循环与make一起使用并不是很“make ish”。makefile是一种基本上基于迭代和递归的完整语言,因此在一个配方中进行“额外”迭代通常是多余的。

    如果您需要迭代某些内容,大多数 尤其地 当某物是文件时,您应该尝试利用其目标/前提条件组织来使用make。上面给出了一个算法:

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

    这非常适合make的默认行为。要将其转换为makefile,您需要编写一个规则来调用循环的单个迭代,然后使用先决条件为所需的文件运行它。像这样:

    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 它只运行一个测试,而不是所有的测试。

    你必须使用 static pattern rules 这里不是正常的模式规则,因为 .PHONY 目标无法使用模式规则。