gpt4 book ai didi

testing - 实现 `make check` 或 `make test`

转载 作者:行者123 更新时间:2023-11-28 19:39:29 28 4
gpt4 key购买 nike

如何使用 Make 实现一个简单的回归测试框架? (如果重要的话,我正在使用 GNU Make。)

我当前的 makefile 看起来像这样(为简单起见进行了编辑):

OBJS = jscheme.o utility.o model.o read.o eval.o print.o

%.o : %.c jscheme.h
gcc -c -o $@ $<

jscheme : $(OBJS)
gcc -o $@ $(OBJS)

.PHONY : clean

clean :
-rm -f jscheme $(OBJS)

我想要一组回归测试,例如expr.in 测试一个“好的”表达式 & unrecognized.in 测试一个“坏”的,expr.cmp & unrecognized.cmp 是每个的预期输出。手动测试看起来像这样:

$ jscheme < expr.in > expr.out 2>&1
$ jscheme < unrecognized.in > unrecognized.out 2>&1
$ diff -q expr.out expr.cmp # identical
$ diff -q unrecognized.out unrecognized.cmp
Files unrecognized.out and unrecognized.cmp differ

我想在 makefile 中添加一组规则,如下所示:

TESTS = expr.test unrecognized.test

.PHONY test $(TESTS)

test : $(TESTS)

%.test : jscheme %.in %.cmp
jscheme < [something.in] > [something.out] 2>&1
diff -q [something.out] [something.cmp]

我的问题:
• 我应该在 [something] 占位符中放置什么?
• 有没有一种方法可以将来自 diff 的消息替换为“测试 expr 失败”的消息?

最佳答案

如问题中所述,您的原始方法是最好的。您的每个测试都采用一对预期输入和输出的形式。 Make 非常有能力遍历这些并运行测试;无需使用 shell for环形。事实上,通过这样做,您将失去并行运行测试的机会,并为您自己创建额外的工作以清理临时文件(不需要)。

这是一个解决方案(以 bc 为例):

SHELL := /bin/bash

all-tests := $(addsuffix .test, $(basename $(wildcard *.test-in)))

.PHONY : test all %.test

BC := /usr/bin/bc

test : $(all-tests)

%.test : %.test-in %.test-cmp $(BC)
@$(BC) <$< 2>&1 | diff -q $(word 2, $?) - >/dev/null || \
(echo "Test $@ failed" && exit 1)

all : test
@echo "Success, all tests passed."

该解决方案直接解决了您的原始问题:

  • 您要查找的占位符是 $<$(word 2, $?)对应先决条件 %.test-in%.test-cmp分别。与@reinierpost 评论相反,不需要临时文件。
  • diff 消息被隐藏并使用 echo 替换.
  • 应使用 make -k 调用 makefile运行所有测试,无论单个测试是失败还是成功。
  • make -k all仅当所有测试都成功时才会运行。

我们在定义 all-tests 时避免手动枚举每个测试通过利用文件命名约定 ( *.test-in ) 和 GNU make functions for file names 变量.作为奖励,这意味着解决方案可以开箱即用地扩展到数万个测试,因为变量的长度是 unlimited。在 GNU 中。这比基于 shell 的解决方案要好,后者一旦您进入操作系统就会崩溃 command line limit .

关于testing - 实现 `make check` 或 `make test`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4927676/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com