首页 > 解决方案 > 如何使用接受命令行参数的嵌套模块对 python 脚本进行单元测试?

问题描述

我有一个这样的示例代码。如何使用不同的输入 a、b、c(通过命令行)对 gen_a、gen_b、gen_c、...、gen_z 进行单元测试?我知道,我的代码组织得非常糟糕......这些模块不接受任何输入。那么,如何在单元测试中设置命令行参数呢?谢谢!

import argparse

def parse_args():
    parser = argparse.ArgumentParser(description='Davidson')
    parser.add_argument('-a', '--a',  type=int,   default=1,)
    parser.add_argument('-b', '--b',  type=int,   default=2)
    parser.add_argument('-c', '--c',  type=int,   default=3)
    return parser.parse_args()


def gen_d():
    args = parse_args()
    a = args.a
    b = args.b
    c = args.c
    '''using a,b,c to create d '''
    return d

def gen_e():
    d = gen_d()
    '''using d create e '''
    return e

def gen_f():
    e = gen_e()
    '''using e create f '''
    return f

def gen_g():
    f = gen_f()
    '''using f create g '''
    return g

'''and so on'''

def gen_z():
    y = gen_y()
    '''using y create z '''
    return z

标签: pythonunit-testing

解决方案


命令行由 Python 中的列表变量表示,该sys.argv变量可以在每个单元测试中使用要指定的参数显式设置。

parse_args()函数默认使用 sys.argv 作为参数列表,但您可以通过指定显式参数列表来覆盖它;例如parser.parse_args(args=myargs)

== mylib.py ==

import argparse

def parse_args(s):
    parser = argparse.ArgumentParser(description='Davidson')
    parser.add_argument('-a', '--a',  type=int,   default=1)
    parser.add_argument('-b', '--b',  type=int,   default=2)
    parser.add_argument('-c', '--c',  type=int,   default=3)
    return parser.parse_args()
    
def gen_d():
    args = parse_args()
    a = args.a
    b = args.b
    c = args.c
    # using a,b,c to create d
    d = a + b + c
    return d

'''and so on'''

这是调用您的代码的示例单元测试类。

== mytest.py ==

import unittest
import sys
import mylib

class MyTest(unittest.TestCase):

    def test_gen_d(self):
        # mock command-line args to your script:
        sys.argv = ['python', '--a=100', '--b=20']      
        value = mylib.gen_d()
        self.assertEqual(123, value)

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

推荐阅读