繁体   English   中英

带有命令行参数的单元测试

[英]Unittest with command-line arguments

根据我从另一篇SO帖子中了解到的,要对通过argparse接受命令行参数的脚本进行单元测试,我应该执行以下代码,将sys.argv [0]设为arg。

import unittest
import match_loc

class test_method_main(unittest.TestCase):

    loc = match_loc.main()
    self.assertEqual(loc, [4])


if __name__ == '__main__':
    sys.argv[1] = 'aaaac'
    sys.argv[2] = 'ac'
    unittest.main(sys.argv[0])

这将返回错误:

usage: test_match_loc.py [-h] text patterns [patterns ...]
test_match_loc.py: error: the following arguments are required: text, patterns

我想更深入地了解这里发生的事情。 我明白

if __name__ == '__main__': main()

表示如果这是由“ main”(最高级别的默认解释器)执行的,则仅自动运行“ main”方法。 我假设

if __name__ == '__main__': unittest.main()

恰好是您说的运行unittest脚本的方式。

我知道运行任何脚本时,它都会自动有一个argv对象,一个收集命令行上所有项目的向量。

但是我不知道unittest.main(sys.arg[0])会做什么。 'unittest.main'与参数有什么关系? 我如何预先设置sys.argv的值-每次运行脚本时它不会自动重置吗? 此外,如果在任何脚本之外,此对象“ sys.argv”在哪里存在? 最后,实现命令行参数测试的正确方法是什么?

如果我的问题含糊不清且被误导,我感到抱歉。 我想了解这里的所有相关组件,以便实际上可以了解自己在做什么。

非常感谢你。

仅仅通过处理一对简单文件,我发现在调用者模块主体中修改sys.argv会影响导入模块看到的sys.argv

import sys
sys.argv[1] = 'aaaac'
sys.argv[2] = 'ac'
class test_method_main(unittest.TestCase):
   ...

但是,像这样在main块中修改sys.argv不会在导入的块中显示。 我们可以深入研究文档(和代码)来确切地了解原因,但是我认为仅仅确定有效的方法就足够了。

这是我从上一个导入模块的问题中重新构建的内容-带有一些诊断信息

import argparse
import sys
def main():
    print(sys.argv)
    parser = argparse.ArgumentParser(
            description='Takes a series of patterns as fasta files'
            ' or strings and a text as fasta file or string and'
            ' returns the match locations by constructing a trie.')
    parser.add_argument('text')
    parser.add_argument('patterns', nargs='+')
    args = parser.parse_args()
    print(args)
    return 1

您还可以使用自己的字符串列表测试解析器,以确认parse_args使用sys.argv[1:]如果其参数缺失或无):

def main(argv=None):
    print(argv)
    ...
    args = parser.parse_args(argv)
    print(args)
    return 1

loc = match_loc.main(['abc','ab'])  # and in the caller

即使我能够构造一个有效的测试用例,您实际上也应该已经提供了足够的信息,而我不需要猜测或挖掘。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM