python - 测试具有用户输入的python函数的问题(pytest)
问题描述
我的测试有一些问题。我想用一些简单的脚本(在本例中为 BMI 计数器)开始我的 pytest 冒险。我想测试一次功能,但测试将进入所有功能。如果我评论了输入值,则测试通过。
输出:
$ pytest test_bmi.py
=========================================================================================== test session starts ============================================================================================
platform darwin -- Python 3.7.1, pytest-4.0.2, py-1.7.0, pluggy-0.8.0
rootdir: /Users/mateusz/Documents/Code_Me_Python/zajecia_python/Zajecia_1, inifile:
plugins: remotedata-0.3.1, openfiles-0.3.1, doctestplus-0.2.0, arraydiff-0.3
collected 0 items / 1 errors
================================================================================================== ERRORS ==================================================================================================
_______________________________________________________________________________________ ERROR collecting test_bmi.py _______________________________________________________________________________________
test_bmi.py:1: in <module>
from bmi import count_bmi
bmi.py:14: in <module>
main()
bmi.py:11: in main
(mass, height) = users_data()
bmi.py:2: in users_data
mass = float(input("Your weight: "))
../../../../anaconda3/lib/python3.7/site-packages/_pytest/capture.py:656: in read
raise IOError("reading from stdin while output is captured")
E OSError: reading from stdin while output is captured
--------------------------------------------------------------------------------------------- Captured stdout ----------------------------------------------------------------------------------------------
Your weight:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================================================================= 1 error in 0.16 seconds =========================================================================================
我已经尝试过'monkeypatch'(如代码段中所述),将值输入变量以将它们传递给测试。没有任何帮助。
bmi.py
def users_data():
mass = float(input("Your weight: "))
height = float(input("Your height: "))
return mass, height
def count_bmi(mass, height):
bmi = round(mass / (height**2), 2)
return bmi
def main():
(mass, height) = users_data()
print(count_bmi(mass, height))
main()
test_bmi.py
from bmi import count_bmi
def test_count_bmi(monkeypatch):
ans1 = '60'
ans2 = '1.7'
ans3 = '20.76'
with monkeypatch.context() as m:
m.setattr('builtins.input', lambda x: ans1, ans2)
result = count_bmi(ans1, ans2)
assert result == ans3
如果我评论输入变量
def test_count_bmi(self):
count_bmi.input = lambda: ''
output = count_bmi(60, 1.7)
assert output == '20.76'
我希望通过考试。
解决方案
问题是main()
模块级别的调用。这将在模块导入时执行main
功能;bmi
使用常见的成语来规避这一点:
# bmi.py
def users_data():
...
def count_bmi(mass, height):
...
def main():
...
if __name__ == "__main__":
# execute only if run as a script
main()
如果您想了解更多信息,请参阅主题__main__
— Python 文档中的顶级脚本环境;此外,SO 对此有一个重要的问题:如果 __name__ == “__main__”: 会做什么?
推荐阅读
- java - 使用 JsonObjectRequest 和 GET 请求发送 JSON 正文
- android - 使用 executor 在 android 中运行下载管理器任务
- python - 如何修改视图以仅向一个分配的用户显示数据?
- java - java.sql.SQLException:字段 'useremail' 没有默认值
- python - 当使用 tkinter 中的复选框使用 for 循环放置在他的窗口中时,有没有办法让它们引用不同的变量?
- javascript - 将图标放在带有文本溢出省略号的两行行之后,而不会中断第 3 行
- django - VSCode Django 虚拟环境包装器
- javascript - 显示隐藏字段的可引导详细信息格式化程序
- swift - 斯威夫特用户界面。自定义绑定值更改时如何通知?
- r - 在 R 或 Excel 中计算多行中不同定性值的数量