我编写了一个简单的命令行实用程序,该实用程序接受文本文件并使用click模块在其中搜索给定的单词。
sfind.py
import click
@click.command()
@click.option('--name', prompt='Word or string')
@click.option('--filename', default='file.txt', prompt='file name')
@click.option('--param', default=1, prompt="Use 1 for save line and 2 for word, default: ")
def find(name, filename, param):
"""Simple program that find word or string at text file and put it in new"""
try:
with open(filename) as f, open('result.txt', 'w') as f2:
count = 0
for line in f:
if name in line:
if param == 1:
f2.write(line + '\n')
elif param == 2:
f2.write(name + '\n')
count += 1
print("Find: {} sample".format(count))
return count
except FileNotFoundError:
print('WARNING! ' + 'File: ' + filename + ' not found')
if __name__ == '__main__':
find()
现在我需要使用unittest编写测试(需要使用unittest)。
test_sfind.py
import unittest
import sfind
class SfindTest(unittest.TestCase):
def test_sfind(self):
self.assertEqual(sfind.find(), 4)
if __name__ == '__main__' :
unittest.main()
运行测试时:
python -m unittest test_sfind.py
我遇到错误
click.exceptions.UsageError:出现了意外的额外参数(test_sfind.py)
如何测试此点击命令?
答案 0 :(得分:2)
您不能简单地调用click命令,然后期望它返回。用于发出单击命令的装饰器会大大改变功能的行为。幸运的是,点击框架通过CliRunner
类提供了此功能。
您的命令可以通过unittest进行如下测试:
import unittest
import sfind
from click.testing import CliRunner
class TestSfind(unittest.TestCase):
def test_sfind(self):
runner = CliRunner()
result = runner.invoke(
sfind.find, '--name url --filename good'.split(), input='2')
self.assertEqual(0, result.exit_code)
self.assertIn('Find: 3 sample', result.output)
答案 1 :(得分:1)
对于那些想要在单击命令中测试异常的人,我找到了这样做的方法:
def test_download_artifacts(
self,
):
runner = CliRunner()
# test exception raised for invalid dir format
result = runner.invoke(
my_module.download_artifacts,
'--bucket_name my_bucket \
--artifact_dir artifact_dir'.split(),
input='2')
print(f"result.exception: {result.exception}")
assert "Enter artifact_dir ending" in str(result.exception)