单元测试诅咒

时间:2016-04-18 20:12:18

标签: python unit-testing

我正在学习单元测试,我在使用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

2 个答案:

答案 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。原因是你可以轻松控制它返回的内容。你甚至可以提出错误。以下是文档中的一些示例:

https://docs.python.org/3/library/unittest.mock.html#patch

答案 1 :(得分:0)

想象一下,每行代码都不存在,或者已被更改为错误。编写一个需要该代码行的测试。

>>> has_colours('hello')
False

>>> has_colours(StringIO())
False

你可能需要传入一个虚假的诅咒而不是导入真实的东西。