python,unittest:有没有办法将命令行选项传递给应用程序

我有一个模块,导入unittest和有一些TestCases。 我想接受一些命令行选项(例如下面的数据文件的名称),但是当我尝试传递选项时,我收到消息“选项-i not recognized”。 是否有可能unit testing+提供选项的应用程序(注:我使用optparse来处理选项)? 谢谢。

$ python test_app_data.py -i data_1.txt option -i not recognized 

=====================

后续:这是一个build议解决scheme的实现:

 import cfg_master #has the optparse option-handling code ... if __name__ == '__main__': #add you app's options here... options_tpl = ('-i', '--in_dir', '-o', '--out_dir') del_lst = [] for i,option in enumerate(sys.argv): if option in options_tpl: del_lst.append(i) del_lst.append(i+1) del_lst.reverse() for i in del_lst: del sys.argv[i] unittest.main() 

基于Alex的回答,使用argparse实际上很容易:

 if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--input', default='My Input') parser.add_argument('filename', default='some_file.txt') parser.add_argument('unittest_args', nargs='*') args = parser.parse_args() # TODO: Go do something with args.input and args.filename # Now set the sys.argv to the unittest_args (leaving sys.argv[0] alone) sys.argv[1:] = args.unittest_args unittest.main() 

我没有testing过所有可以传入unittest的标志,看看它们是否工作,但是通过testing名称是行不通的,例如:

 python test.py --input=foo data.txt MyTest 

foodata.txt运行MyTest。

在你的if __name__ == '__main__':部分,你不需要显示我们,你需要optparse ,然后del sys.argv[1:] ,然后再将控制权交给unit testing代码,这样后面的代码就不会当你已经处理它们时,不要试图再次解释你的命令行选项。 (有一些自己的select有点困难也可以通过一些unit testing,尽pipe如果你有这样复杂的需求就可以完成)。

对于小型的独立应用程序,我使用了一个初始的sentinel选项(-t),并在调用argparse.ArgumentParser()之前调用unittest.main()

 if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] in ["-t", "--test"]: del(sys.argv[1]) sys.exit(unittest.main()) # pass sys.argv[ p = argparse.ArgumentParser() . . . 

你不应该拿参数和选项来运行unit testing,因为你用这种方式在不同的,不太可预测的条件下运行它们。 您应该弄清楚为什么需要使用不同的数据运行testing,并且使testing套件足够覆盖所有数据集的基础,而不是每次都以不同的方式运行。