unittest和pytest ========================================= 前置和后置动作 ---------------------------------------- 模块级 .. tabs:: .. group-tab:: pytest .. code-block:: python def setup_module(): ... def teardown_module(): ... .. group-tab:: unittest .. code-block:: python def setUpModule(): createConnection() def tearDownModule(): closeConnection() :应用案例: Lib/test/test_asyncio/test_base_envents line:26 :应用场景: 做一些全局的设置,如修改配置值、默认值等 类级 .. tabs:: .. group-tab:: pytest .. code-block:: python 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: 每个用例结束后都会执行") .. group-tab:: unittest .. code-block:: python import unittest class Test(unittest.TestCase): @classmethod def setUpClass(cls): cls._connection = createExpensiveConnectionObject() @classmethod def tearDownClass(cls): cls._connection.destroy() 函数级 .. tabs:: .. group-tab:: pytest .. code-block:: python def setup_function(): ... def teardown_function(): ... .. group-tab:: unittest .. code-block:: python def test_name(self): def func(): pass self.addCleanup(func) 加载测试用例 ------------------------------------------- .. code-block:: python suite = unittest.TestSuite() # 加载所有测试方法 suite.addTest(unittest.makeSuite(MyTestCase)) 也可以使用test.support.run_unittest,不过这个函数不能通过stream获取运行结果。 断言方法 ----------------------------------------- * assertRegex - test_base_events.py line:1301 * assertContains - 跟http相关的断言方法 异常 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. tabs:: .. group-tab:: pytest .. code-block:: python def test_function(): with pytest.raises(ValueError): raise ValueError .. group-tab:: unittest .. code-block:: python def test_function(self): with self.assertRaises(ValueError): raise ValueError 定制测试报告 ------------------------------------------ 关键类: TextTestRunner, TextTestResult ``TextTestRunner`` 的默认测试报告类是 ``TextTestResult`` ,想定制自己的测试报告,只需继承 ``TextTestResult`` 和重写部分方法, 然后传入到 ``TextTestRunner`` 的参数 ``resultclass`` 即可。 例如,假设测试报告是发送给客户看的,测试报告不应该显示traceback的详细内容,只需重写 ``TextTestResult`` 的 ``_count_relevant_tb_levels`` 方法, return 0,即可只显示最后一行报错结果,其他的信息不显示。 todo --------------------------------------------- **创建临时目录** .. code-block:: python # content of test_tmpdir.py def test_needsfiles(tmpdir): print(tmpdir) assert 0 .. code-block:: text pytest --fixtures # shows builtin and custom fixtures **跟input交互** 加上-s参数