实施“make check”或“make test”

2024-01-17

如何用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)

我想要一组回归测试,e.g., 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 非常有能力迭代这些并运行测试;无需使用 shellfor环形。事实上,通过这样做,您将失去并行运行测试的机会,并且会为自己创建额外的工作以清理临时文件(不需要)。

这是一个解决方案(使用bc http://www.gnu.org/software/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."

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

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

我们在定义时避免手动枚举每个测试all-tests通过利用文件命名约定来变量(*.test-in)和 GNU make文件名函数 https://www.gnu.org/software/make/manual/html_node/File-Name-Functions.html。作为奖励,这意味着解决方案可以扩展到开箱即用的数万个测试,因为变量的长度是无限 https://www.gnu.org/software/make/manual/html_node/Setting.html#Setting在 GNU make 中。这比基于 shell 的解决方案要好,后者一旦进入操作系统就会崩溃命令行限制 https://stackoverflow.com/questions/19354870/bash-command-line-and-input-limit.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实施“make check”或“make test” 的相关文章

  • 独立 Symfony2 包内的功能测试

    我需要直接在独立包中进行一些功能测试 我不想测试控制器 只是测试真实服务之间的一些交互 我想知道是否有标准 最佳方法可以做到这一点 我用一种方法做到了 但想知道是否有更好的方法 这是我自己的解决方案 我总结了在独立包中测试的所有过程 1 首
  • GNU Make 与 patsubst:需要两次替换

    我需要在变量替换的替换中引用词干两次 O23 OROOTS ODIR overx 2wk 3wk mlb 我需要使用相同的词干执行两次替换 但是替换使用patsubst这只做第一个 我们怎样才能同时实现这两点呢 事实上 杰克几乎猜对了 fo
  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • 如何顺序运行 golang 测试?

    当我跑步时go test 我的输出 FAIL TestGETSearchSuccess 0 00s Location drivers api test go 283 Error Not equal 200 expected 204 actu
  • 在 JerseyTest 中访问 Spring beans

    我试图弄清楚如何从 JerseyTest 的子类访问 Spring bean 扩展 JerseyTest 我已经设法在测试中加载 Spring 上下文 但我还没有弄清楚如何访问 spring 上下文 我的设置如下所示 public abst
  • 如何添加 Maven 执行任务以在“mvn test”上执行

    我的 pom 中有以下 exec 任务
  • mocha——手表和猫鼬模型

    如果我让 mocha 监视更改 每次保存文件时 mongoose 都会抛出以下错误 OverwriteModelError 无法覆盖Client模型一旦编译 我知道猫鼬不允许两次定义模型 但我不知道如何让它与mocha watch clie
  • EDI AS2 HTTP 跟踪?

    我们正在研究 AS2 实现 并希望能够构建有意义的测试用例以与 SoapUI 或 Postman 一起使用 为了做到这一点 我们有两种方法 只是尝试从现有客户端进行 tcp 转储 跟踪调用 从普通 EDI 文档开始手动构建一些简单的调用 或
  • 在 Mac OS X 上的 Makefile 中设置 PATH(但它适用于 Linux)

    我可以在 Linux 上的 Makefile 中设置 PATH 但不能在 Mac OS X 上设置 在 OS X 中 可以设置 PATH 但不会使用 这是一个演示 在带有 bash 4 1 2 1 release 和 GNU Make 3
  • 在 docker 镜像 python:3.9.13-alpine3.16 上使用“pip install psutil”错误:找不到 linux/ethtool.h

    我尝试在 docker 中安装 python 模块 psutilpython 3 9 13 alpine3 16但它报告了以下错误 Building wheels for collected packages psutil Building
  • Django:出于测试目的阻止互联网连接

    我想确保我的单元测试不会尝试连接到互联网 有没有办法在连接时引发异常 有一个类似的问题Python 出于测试目的阻止网络连接 https stackoverflow com questions 18601828 python block n
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 如何在调试器模式下运行 perl 测试?

    我尝试在调试器下运行测试 perl d which prove t file t 但这没有任何效果 因为每个测试都是作为单独的作业运行的 我已经发现 exec选项 但是当我提供它时 我失去了任何选项 proverc文件和命令行 prove
  • django RequestFactory 文件上传

    我尝试使用 RequestFactory 创建请求并使用文件发布 但我没有收到 request FILES from django test client import RequestFactory from django core fil
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • 此 bash 命令在 Makefile 中未正确运行

    在 Makefile 里面我有这样的 release version poetry version cut f2 d echo release version 如果我运行 我的终端中的语句将毫无问题地运行 gt version poetry
  • 如何调用使用 Define 创建的 GNU make 宏?

    在我的 Makefile 中调用 GREP 的两种方式有什么区别吗 我有什么理由应该使用其中之一 两者似乎产生相同的结果 define GREP word 3 shell echo define FOO 0xfff00100 endef a
  • 什么是 Android 测试协调器?

    谷歌最近发布了Android测试支持库1 0 读完后overview https android developers googleblog com 2017 07 android testing support library 10 is
  • 将环境变量从 Makefile 导出到用户态环境

    我正在研究如何从 Makefile 环境变量导出以在用户环境中公开 因此应该可以从用户 shell 访问从 Makefile 导出这些变量 我努力了make s export https www gnu org software make
  • MinGW Make 抛出“系统找不到指定的路径。”错误

    我正在尝试在 Windows 7 上使用 cmake 生成一个 c 项目 在实际创建项目之前 cmake 会对您的工具链进行快速测试 我正在使用 MinGW 这就是我的问题所在 Cmake 触发 make 构建 最终失败并返回 系统找不到指

随机推荐

  • prefix(_ maxLength:) 与符合 LazySequenceProtocol 的结构一起使用时会被类型擦除

    prefix maxLength returns a type erased Sequence in the following codeEXAMPLE http swift sandbox bluemix net repl 599df10
  • 下载文件时如何针对不同浏览器正确设置中文文件名

    我这样设置 response setHeader content disposition attachment filename URLEncoder encode 你好 txt utf 8 它在 Chrome 中有效 但在 Firefox
  • 如何将一个向量的参数插入另一个向量?

    我有一个大小为 5 的 重心 向量 parameter Length barycenters 5 1 2 3 4 5 我想将此向量的参数添加到另一个大小为 7 的向量 b prime 中 这意味着打算让 b prime 0 1 2 3 4
  • 闪亮动态添加输入字段和数据而无需重新渲染

    我正在尝试动态地将新变量添加到正在运行的闪亮应用程序中 但如果我开始编辑一个变量 则每次我添加其他变量时 值 文本和数字 都会重置 这example https stackoverflow com a 56468913 4083743无需使
  • 什么是好的“模板”Yosys 合成脚本?

    我想编写自己的 Yosys 综合脚本 从什么开始是一个好的模板 手册和网页包含各种示例 但没有 权威 的 hello world 示例 The synth命令运行通用综合任务的推荐脚本 看help synth http www cliffo
  • 函数调用后记住数组值

    如果我这样写 c def cf n c range 5 print c if any i gt 3 for i in c is True print hello cf 1 print c 然后我得到 1 2 3 4 hello 我对编程真的
  • 在 PyCharm IDE 5.0.4 中运行特定的单元测试函数

    我正在尝试使用 PyCharm 进行单元测试 使用unittest 并且能够使其工作 测试运行器很好地显示了测试用例和嵌套测试函数的列表 但是 一旦发现测试 我就找不到任何方法来 重新 运行特定的测试函数 唯一可用的按钮将运行整个测试列表
  • 如何解码 JSFuck 脚本?

    我在 JavaScript 中有这样的代码 在控制台中 它将返回 Array filter 如何解码大量与上面文本相似的文本 例如
  • 获取用户当前位置 iOS 8.0

    我尝试使用 MapKit 和 CoreLocation 获取用户当前位置 我对 Objective C 真的很陌生 就我的研究而言 旧版 iOS 到 iOS 8 0 的实现略有不同 我已经正确地遵循了一切 它仍在获取当前位置 我的实际目标是
  • 清除 Bootstrap 中的表单输入字段?

    Bootstrap 是否提供了通过按钮清除表单输入字段的功能 或者我需要通过 jquery 自己推出 从这篇文章jQuery Validate resetForm 不会重置 onFocus 验证 https stackoverflow co
  • 更改 config.assets.version 号有什么作用?

    更改 config assets version 号有什么作用 我知道资产会过期 正如评论中所写 但它在后台会做什么 它会删除所有已编译的资源吗 或者它是否采用该版本号并在其他地方使用它 它将使用另一个指纹 代码附加到文件名 来预编译资产
  • 量角器关闭当前选项卡

    我有一个非角度页面 我需要点击 2 个链接 单击自动在新选项卡中打开的链接之一时 现在我切换到新选项卡并设置browser ignoreSynchronization false因为新打开的选项卡是一个有角度的窗口 并调用我的测试之一 一经
  • 如何用权重标记图边

    Warning 当 Mathematica v 8 0 是最酷的孩子时 我发布了这个问题 该bug已于9 0 1版本解决 The help for EdgeLabels http reference wolfram com mathemat
  • Spark 中函数返回空列表

    下面是获取压缩文件中文件名列表的代码 def getListOfFilesInRepo zipFileRDD RDD String PortableDataStream List String val zipInputStream zipF
  • 如何从 MVC3 中的控制器调用 javascript 函数

    我环顾四周 找不到解决方案 因此我发现自己在这里 根据我所读到的内容 我可以使用 RegisterClientScript 或 RegisterClientScriptBlock 在 ASP NET Web 表单中执行此操作 我在任何 MV
  • redis HLL 误报太多

    Hyperlog日志是一种概率算法 根据 redis HLL 文档 我们可能会得到 0 81 的错误 但我得到的错误是 17 20 我认为有问题 这是我的简单 perl 测试脚本 有没有什么错误 usr bin perl w use Red
  • 如何检测git中的分支点?

    我正在尝试确定分支中的第一次提交 我读过其他各种 SO 帖子 包括用 Git 寻找分支点 https stackoverflow com questions 1527234 finding a branch point with git 但
  • 在手机上看到的带有 mathjax 的博客

    我正在使用 mathjax我的博客点博客 http ochopatas blogspot mx 在电脑上看效果很好 但在手机上看公式就不会变形 我找到了这个其他博客点博客 http imflaud blogspot mx 2016 07 i
  • AngularJS 与 .NET MVC 捆绑缩小错误

    我一直在 NET MVC 网站内开发一个大型 AngularJS 应用程序 我已经花了很长时间没有测试它是否会使用捆绑优化功能成功缩小 BundleTable EnableOptimizations True 当然 它失败了 我一直在玩捆绑
  • 实施“make check”或“make test”

    如何用Make实现一个简单的回归测试框架 我正在使用 GNU Make 如果这很重要的话 我当前的 makefile 看起来像这样 为简单起见进行了编辑 OBJS jscheme o utility o model o read o eva