我正在学习单元测试,我在使用python时遇到了一个关于它的问题,但我不太了解这种语言。我怎么能对这个功能进行单元测试? :
#following from Python cookbook, #475186
def has_colours(stream):
if not hasattr(stream, "isatty"):
return False
if not stream.isatty():
return False # auto color only on TTYs
try:
import curses
curses.setupterm()
return curses.tigetnum("colors") > 2
except:
# guess false in case of error
return False
答案 0 :(得分:1)
您应该/或者最好通过在每个测试用例中发送适当的输入来涵盖您的函数处理的所有可能方案。这是测试类的存根,用于理解我的意思:
import unittest
class TestHasColors(unittest):
def test_has_colors_returns_false_when_stream_does_not_have_func_tty(self):
# Call `has_colours` with stream that does not have it and verify return result is False
stream = object()
assert has_colours(stream) is False
def test_has_colors_returns_false_when_stream_func_tty_returns_false(self):
# TODO: Call `has_colours` with stream that has func tty and verify return result is False
pass
def test_has_colors_returns_false_when_curses_raises_error(self):
# TODO: Call `has_colours` with stream that reaches up to `curses.tigetnum` and patch it to raise an error
pass
def test_has_colors_returns_false_when_curses_tigetnum_colors_less_than_three(self):
# TODO: Call `has_colours` with stream that reaches up to `curses.tigetnum` and patch to return anything lte 2
pass
def test_has_colors_returns_true_when_curses_tigetnum_colors_greater_than_two(self):
# TODO: Call `has_colours` with stream that reaches up to `curses.tigetnum` and patch to return anything gt 2
pass
注意:最后3个测试用例需要修补curses.tigetnum
。原因是你可以轻松控制它返回的内容。你甚至可以提出错误。以下是文档中的一些示例:
答案 1 :(得分:0)
想象一下,每行代码都不存在,或者已被更改为错误。编写一个需要该代码行的测试。
>>> has_colours('hello')
False
>>> has_colours(StringIO())
False
等
你可能需要传入一个虚假的诅咒而不是导入真实的东西。