我可以用mock()(或类似的方法)来模拟日期和时间,以便从单元测试中调用脚本吗?

2024-03-29 04:40:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python中的unittest编写了一些单元测试。但是,它们并不是简单地以常规方式测试对象,而是通过使用Popen调用另一个Python脚本。这是经过设计的-它是一个命令行实用程序,所以我想像用户一样测试它,包括命令行选项等)。要清楚的是,单元测试和要测试的脚本都是用Python编写的(准确地说是v3)。你知道吗

我正在测试的脚本大量使用了datetime.now(),理想情况下,我希望以某种方式模拟该值,以便使其保持不变。不过,我看到的所有这样做的例子(例如this one使用mock)都假设了某种形式的白盒测试。你知道吗

我有办法做到这一点吗?你知道吗


Tags: 对象命令行用户实用程序脚本datetime选项方式
1条回答
网友
1楼 · 发布于 2024-03-29 04:40:41

没有什么可以阻止您在不使用Popen的情况下测试CLI。您只需构建代码即可:

而不是这样:

if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser()
    # ... Add args
    ns = parser.parse_args()

请执行以下操作:

import argparse

def main(argv):
    parser = argparse.ArgumentParser()
    # ... Add args
    parser.parse_args(argv[1:])  # This is the default for argparse
    ns = parser.parse_args()

if __name__ == "__main__":
    import sys
    main(sys.argv)

然后,可以单独测试main函数(只需使用指定的一组参数调用main([...]))。请注意,对于其他CLI框架,这也应该起作用(进行一些调整)。你知道吗


另外,请注意,如果确实在使用argparse,则需要修补ArgumentParser(),以便在解析失败时它不会调用sys.exit。你知道吗

一种简单的方法是声明一个ParsingError异常,并用以下内容修补ArgumentParser.error(self, message)

def error(self, message):
    raise ParsingError(message) 

然后可以在测试中使用assertRaises。你知道吗

相关问题 更多 >