测试套件失败后如何防止snakemake停止?

时间:2021-05-04 23:11:57

标签: python pytest snakemake

我正在尝试使用 snakemake 自动化集成测试(我需要一些文件的输出,所以这似乎是一个很好的工具)。但是,当我需要在 pytest 中运行两个测试套件时,如果任一套件中的单个测试失败,工作流就会停止。例如,我有:

rule run_tests:
    run:
        commands = [
            "pytest test_that_should_fail",
            "pytest test_that_should_succeed"
        ]
        for c in commands:
            shell(c)

而且我需要后一个测试应该失败的测试输出。有没有办法防止snakemake在运行“pytest test_that_should_fail”后停止?此外,snakemake 停止而没有任何类型的错误消息只是一个通用的:“规则 run_tests 中的错误:jobid:0”

2 个答案:

答案 0 :(得分:2)

你可以这样写:

commands = [
   "pytest test_that_should_fail || true",
   "pytest test_that_should_succeed || true",
]

然后shell命令的退出代码为0,表示成功,从而继续执行其他命令。

编辑:

这是解决问题的一种简单方法,不是@bli 指出的最干净也不是最惯用的方法。

答案 1 :(得分:1)

我建议你让 Snakemake 处理不同的测试,每个规则实例只运行一个测试。

这可以按如下方式完成(未测试):

TESTS = ["test_that_should_fail", "test_that_should_succeed"]

rule all:
    input:
        logs = expand("{test}.log", test=TESTS),
        errs = expand("{test}.err", test=TESTS),

rule run_test:
    output:
        log = "{test}.log",
        err = "{test}.err",
    shell:
        """
        pytest {wildcards.test} 1> {output.log} 2> {output.err}
        """

然后,您可以使用snakemake 的选项-k 来确保所有测试都将运行。 但是,如果预期返回非零代码,则使用 || true(如 another answer 中建议的那样)可能会更清晰。