【问题标题】:Using Makefiles for unit testing使用 Makefile 进行单元测试
【发布时间】:2014-08-05 01:37:14
【问题描述】:

我想做以下事情:

start:
    @echo start the server

stop:
    @echo stop the server

test1: start stop
    @echo do test1

test2: start stop
    @echo do test2

test-all: test1 test2

但是我有两个问题:

  1. 如何在makefile中指定pre-post-rules? makefile 中的所有规则似乎都是pre-。在这种情况下,我希望在每次测试结束时运行 stop
  2. 如何强制 make 运行 startstop 规则,即使它已经运行它们? 每个的单次测试都需要启动/停止循环,这样当我运行make test-allstartstop时,每个测试都会被调用,而不仅仅是一次第一个需要它们的测试。

【问题讨论】:

    标签: unit-testing makefile


    【解决方案1】:
    test1:
        @echo start the server
        @echo do test1
        @echo stop the server
    
    test2:
        @echo start the server
        @echo do test2
        @echo stop the server
    
    test-all: test1 test2
    

    如果冗余过多(例如,如果您有很多单元测试),您可以定义一个"canned" recipe

    define start-stop
        @echo start the server
        $(1)
        @echo stop the server
    endef
    
    test1:
        $(call start-stop, @echo do test 1)
    
    test2:
        $(call start-stop, @echo do test 2)
    

    【讨论】:

    • 感谢您的建议。是的,我有很多类似的测试。我不喜欢这样一个事实,即它没有使用依赖系统,并且它使整个事情难以阅读。这里的依赖关系在哪里?它们是start(前)和stop(后),但是从您使用的语法(canned recipe?)来看,这一点都不清楚。我希望有一个简单的运算符来指定这是一个必须在规则完成时运行的依赖项,另一个运算符说总是运行这个依赖项,即使它刚刚刚刚运行过
    • 类似:test1: +start +@stop,其中运算符 @ 表示在规则结束时运行此依赖项,运算符+ 表示运行此每次都依赖。我刚刚编写了这些运算符,但类似的东西会使我的测试非常易读。
    • @jeckyll2hide:Make 的依赖处理不是该工作的正确工具,因为它根本不能那样工作。在 Make 中还有其他方法可以做到这一点,但如果您想要可读性,我认为它们不会对此有太大的改进(除非由于单元测试配方的复杂性,该方案不可读)。
    • 感谢您的评论。您会使用什么其他工具来利用单元测试,其中可以使用类似 bash 的语法来进行测试描述?
    • @jeckyll2hide: GoogleTest 看起来很有趣,但如果不合适,我会用我最喜欢的脚本语言编写解析器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2011-11-16
    • 2015-05-28
    • 2012-05-23
    • 2010-11-30
    • 2010-12-31
    相关资源
    最近更新 更多