unittest和pytest

前置和后置动作

模块级

def setup_module():
    ...

def teardown_module():
    ...
应用案例:

Lib/test/test_asyncio/test_base_envents line:26

应用场景:

做一些全局的设置,如修改配置值、默认值等

类级

class TestCase(object):
    def setup_class(self):
        print("setup_class: 所有用例执行之前")

    def teardown_class(self):
        print("teardown_class: 所有用例执行之后")

    def setup_method(self):
        print("setup_method: 每个用例开始前执行")

    def teardown_method(self):
        print("teardown_method: 每个用例结束后执行")

    def setup(self):
        print("setup: 每个用例开始前都会执行")

    def teardown(self):
        print("teardown: 每个用例结束后都会执行")

函数级

def setup_function():
    ...

def teardown_function():
    ...

加载测试用例

suite = unittest.TestSuite()
# 加载所有测试方法
suite.addTest(unittest.makeSuite(MyTestCase))

也可以使用test.support.run_unittest,不过这个函数不能通过stream获取运行结果。

断言方法

  • assertRegex
    • test_base_events.py line:1301

  • assertContains
    • 跟http相关的断言方法

异常

def test_function():
    with pytest.raises(ValueError):
        raise ValueError

定制测试报告

关键类: TextTestRunner, TextTestResult

TextTestRunner 的默认测试报告类是 TextTestResult ,想定制自己的测试报告,只需继承 TextTestResult 和重写部分方法, 然后传入到 TextTestRunner 的参数 resultclass 即可。

例如,假设测试报告是发送给客户看的,测试报告不应该显示traceback的详细内容,只需重写 TextTestResult_count_relevant_tb_levels 方法, return 0,即可只显示最后一行报错结果,其他的信息不显示。

todo

创建临时目录

# content of test_tmpdir.py
def test_needsfiles(tmpdir):
    print(tmpdir)
    assert 0
pytest --fixtures   # shows builtin and custom fixtures

跟input交互

加上-s参数