Python对模块而不是函数进行单元测试



我想写一个test.py文件来测试我写的模块。该程序的规范是,我接受串行用户输入,然后打印,不返回单个答案。用户输入的第一行表示接下来将有多少个输入。通过一个示例程序,"4n1n2n3n4n"这意味着有4个输入,输入是[1,2,3,4]。下面是接受输入(sumEx.py)的程序示例:

import sys
def sum():
n = int(sys.stdin.readline().strip())
nums = []
for _ in range(n):
nums.append(int(sys.stdin.readline().strip()))
result = 0
for num in nums:
result += num

print(result)
if __name__ == "__main__":
sum()

我意识到在这个例子中for循环是多余的,但这只是我正在处理的抽象问题的实际程序的一个例子。目前,这是我的测试文件:

from io import StringIO
import sys
from _pytest.monkeypatch import MonkeyPatch
import unittest
from sumEx import sum as program
class Testing(unittest.TestCase):
def test_string(self):
monkeypatch = MonkeyPatch()
monkeypatch.setattr('sys.stdin', StringIO("8n1n2n3n4n5n6n7n8n"))
self.assertEqual(program(), 36)
def test_boolean(self):
monkeypatch = MonkeyPatch()
monkeypatch.setattr('sys.stdin', StringIO("4n1n2n3n"))
self.assertEqual(program(), 6)
if __name__ == '__main__':
unittest.main()

问题是,我的测试只会工作,如果我返回他们而不是打印他们。理想情况下,我的测试文件将调用文件sumEx.py,然后调用

if __name__ == "__main__":
sum()

将调用sum函数,测试将提供输入(就像实际的人键入每行一样),然后sum打印的内容将被视为测试的输出。非常感谢任何帮助。如果有些东西太模糊,请提出任何问题。谢谢你!

如果有人好奇,这就是我现在要用的。它从文件中获取输入,并通过sys.stdin模拟用户输入。然后,它从文件中读取正确的输出,并将其与程序的输出进行比较。它还在参数化的帮助下运行带有不同输入的相同测试用例。谢谢@ beanbremen先生的建议!

class Testing(unittest.TestCase):
def load_file(self, fileName, inOut):
try:
inputFile = open(fileName, 'r')
fileInput = r'{}'.format(inputFile.readline())
for line in inputFile.readlines():
fileInput = r'{}'.format(fileInput + line)
if inOut == 'in':
fileInput = r'{}'.format(fileInput+'n')
inputFile.close()
return fileInput
except:
print("ERROR LOADING FILE")

@parameterized.expand([
["./tests/test0in.txt", "./tests/test0out.txt"],
["./tests/test1in.txt", "./tests/test1out.txt"],
["./tests/test2in.txt", "./tests/test2out.txt"]])
@patch('sys.stdout', new_callable=StringIO)
def test(self, inputFile, outputFile, mock_stdout):
monkeypatch = MonkeyPatch()
monkeypatch.setattr('sys.stdin', StringIO(self.load_file(inputFile, "in")))
program.main()
self.assertEqual(mock_stdout.getvalue(), self.load_file(outputFile, "out"))

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

最新更新