python 如何编写Makefile来测试多个Unittest目标?

xzlaal3s  于 2023-06-04  发布在  Python
关注(0)|答案(3)|浏览(382)

我正在尝试编写一个通用的Makefile,它可以基于make命令中的第二个术语运行多个不同的单元测试。
基本上,我想写一些像这样的东西:

make test target1 # runs unit tests for target 1
make test target2 # runs unit tests for target 2
      :
      :
      :
make test all     # runs all unit tests

但我找不到任何关于如何操作的文档。我现在有的是:

.PHONY: clean test
test-target1:
        pytest --cov-report term-missing --cov=a .\target1\
test-target2:
        pytest --cov-report term-missing --cov=b .\target2\
test-all:
        ### I don't know what to put here ###

但是这个语法要求你使用make test-target1并包括连字符。
编辑:
基于一些非常好的建议,我现在有了更新的Makefile:

a: # ...
    pytest --cov-report term-missing --cov=a.\UnitTest\a

.PHONY: test
test : $(RUN_ARGS)
    @echo "Running unittests for $(RUN_ARGS)..."

但是运行make test a返回

Running unittests for ...
make: 'a' is up to date.

如果我把a改为a1,那么make test a1将运行实际的单元测试。为什么不允许a RUN_ARGS?
作为参考,代码的结构是:

src/a
src/b
src/UnitTest
src/UnitTest/a
src/UnitTest/b
2j4z5cfb

2j4z5cfb1#

就看其他测试目标了。

test-a:
    $(info $@)

test-b:
    $(info $@)

test-all: test-a test-b

您可以通过使用一个模式来匹配您的测试目标来稍微简化这个过程。像这样:

tests := $(patsubst %,test-%,a b)

test-a:
    $(info $@)

test-b:
    $(info $@)

.PHONY: $(tests)
test-all: $(tests)

其中make test-all产生:

❮ make test-all
test-a
test-b
make: Nothing to be done for `test-all'.
cnjp1d6j

cnjp1d6j2#

感谢我得到的所有帮助,我能够通过创建下面的Makefile来解决我的问题的两个部分:

all: a b c

a: 
    pytest --cov-report term-missing --cov=a .\UnitTest\a\

b: 
    pytest --cov-report term-missing --cov=b .\UnitTest\b\

c: 
    pytest --cov-report term-missing --cov=c .\UnitTest\c\

.PHONY: test a b c

test : $(RUN_ARGS)
    @echo "Running unittests..."
wljmcqd8

wljmcqd83#

您可以使用自动变量($*)和特定于目标的变量(COV)作为参数。第一次尝试时显示的测试规则示例:

.PHONY: clean test
TARGETs := target1 target2 ...

test-%:
    pytest --cov-report term-missing --cov=$(COV) .\$*\

test: $(addprefix test-,$(TARGETS))

test-target1: COV=a
test-target2: COV=b

相关问题