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

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

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

  1. make test target1 # runs unit tests for target 1
  2. make test target2 # runs unit tests for target 2
  3. :
  4. :
  5. :
  6. make test all # runs all unit tests

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

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

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

  1. a: # ...
  2. pytest --cov-report term-missing --cov=a.\UnitTest\a
  3. .PHONY: test
  4. test : $(RUN_ARGS)
  5. @echo "Running unittests for $(RUN_ARGS)..."

但是运行make test a返回

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

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

  1. src/a
  2. src/b
  3. src/UnitTest
  4. src/UnitTest/a
  5. src/UnitTest/b
2j4z5cfb

2j4z5cfb1#

就看其他测试目标了。

  1. test-a:
  2. $(info $@)
  3. test-b:
  4. $(info $@)
  5. test-all: test-a test-b

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

  1. tests := $(patsubst %,test-%,a b)
  2. test-a:
  3. $(info $@)
  4. test-b:
  5. $(info $@)
  6. .PHONY: $(tests)
  7. test-all: $(tests)

其中make test-all产生:

  1. make test-all
  2. test-a
  3. test-b
  4. make: Nothing to be done for `test-all'.
展开查看全部
cnjp1d6j

cnjp1d6j2#

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

  1. all: a b c
  2. a:
  3. pytest --cov-report term-missing --cov=a .\UnitTest\a\
  4. b:
  5. pytest --cov-report term-missing --cov=b .\UnitTest\b\
  6. c:
  7. pytest --cov-report term-missing --cov=c .\UnitTest\c\
  8. .PHONY: test a b c
  9. test : $(RUN_ARGS)
  10. @echo "Running unittests..."
wljmcqd8

wljmcqd83#

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

  1. .PHONY: clean test
  2. TARGETs := target1 target2 ...
  3. test-%:
  4. pytest --cov-report term-missing --cov=$(COV) .\$*\
  5. test: $(addprefix test-,$(TARGETS))
  6. test-target1: COV=a
  7. test-target2: COV=b

相关问题