You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试Snakemake中common.smk文件定义的输入函数?

测试Snakemake输入函数的推荐方法

核心思路:直接导入.smk文件作为Python模块测试

Snakemake的.smk脚本本质就是Python文件,无需依赖dry run,直接导入其中的函数并模拟依赖参数即可完成测试,步骤如下:

  • 步骤1:导入.smk中的函数
    由于Python默认不会识别.smk后缀的文件为模块,需要先将项目根目录加入Python路径,再直接导入。示例测试脚本(如test_common.py):

    import sys
    from pathlib import Path
    from types import SimpleNamespace
    
    # 将项目根目录添加到Python搜索路径
    sys.path.append(str(Path(__file__).parent.parent))
    
    # 直接导入common.smk中的目标函数
    from common import find_fastq_files
    
  • 步骤2:模拟wildcards参数
    输入函数依赖的wildcards是一个包含属性的对象,用types.SimpleNamespace即可模拟:

    def test_find_fastq_files_basic():
        # 模拟wildcards对象,指定sample名称
        wildcards = SimpleNamespace(sample="test_sample")
        # 调用待测试函数
        result = find_fastq_files(wildcards)
        # 断言结果与预期一致
        expected = ["data/test_sample/fastq/read1.fastq.gz", "data/test_sample/fastq/read2.fastq.gz"]
        assert sorted(result) == sorted(expected)
    
  • 步骤3:结合临时目录测试真实文件匹配(可选)
    如果需要验证glob_wildcards的实际匹配逻辑,可借助pytest的tmp_path fixture创建模拟目录结构,确保测试环境隔离:

    def test_find_fastq_files_with_real_files(tmp_path, monkeypatch):
        # 创建模拟的数据目录和测试文件
        sample_fastq_dir = tmp_path / "data" / "test_sample" / "fastq"
        sample_fastq_dir.mkdir(parents=True)
        (sample_fastq_dir / "read1.fastq.gz").touch()
        (sample_fastq_dir / "read2.fastq.gz").touch()
    
        # 切换工作目录到临时路径,让函数能正确解析相对路径
        monkeypatch.chdir(tmp_path)
    
        wildcards = SimpleNamespace(sample="test_sample")
        result = find_fastq_files(wildcards)
        # 转换为字符串路径用于断言
        expected = [str(sample_fastq_dir / "read1.fastq.gz"), str(sample_fastq_dir / "read2.fastq.gz")]
        assert sorted(result) == sorted(expected)
    

优势说明

这种方式跳过了Snakemake dry run的开销,直接针对函数逻辑测试,不仅更高效,还能在函数出现问题时快速定位,无需解析复杂的dry run输出。

内容的提问来源于stack exchange,提问作者Ezra Herman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:01:09