单元测试编写原则
1.一个单元测试应该易于构造和执行
2.一般以一个函数为单位进行单元测试的构造
3.对于一个函数的多种输入输出实例,需要按照等价原则设计相应的单元测试
单元测试框架
目前主流的python单元测试框架是pytest以及nose,两者都是在python的库unittest基础之上封装的更易用的unittest framework。
unittest
先介绍一下pytest/nose的基础unittest库。
unittest库提供了test cases, test suites, test fixtures,test runner:
test case :通过继承TestCase类,我们可以创建一个test,或者一组tests
test suites : 测试套件
test fixtures : setup + test case + teardown结构
test runner
简单的示例:
import unittest class TestStringMethods(unittest.TestCase): def test_upper(self): self.assertEqual('foo',upper(),'FOO') def test_isupper(self): self.assertEqualTure('FOO'.isupper()) self.assertFalse('Foo'.isupper()) def test_split(self): s = 'hello world' self.assertEqual(s.split(),['hello','world']) with self.assertEqualRaise(TypeError): s.slipt(2) if __name__ == '__main__': #unittest.main:为测试提供了入口。 unittest.main() |
运行结果:
…
Ran 3 tests in 0.064s
OK
pytest
在编写单元测试时的逻辑框架与unittest基本一致,既预先设置条件,对比预期结果与实际结果的一致性,但在具体实现上pytest提供了更易用的fixture功能,使得我们在编写测试函数的准备函数、销毁函数或者多个条件的测试提供了更加灵活的选择。
举个简单的例子:
@pytest.fixture() def hello(): return "hello" def test_string(hello): assert hello == "hello", "fixture should return hello" |
解释一下上面的例子:
@pytest.fixture()装饰的函数,是测试函数的依赖注入函数,可以通过传递fixture传递的函数,将函数与函数之间的依赖注入测试函数里,以实现多条件测试,准备条件依赖注入,以及注入销毁函数。
具体可以参考link学习fixture功能:pytest的fixture功能详解
nose
测试用例编写框架结构类似unittest,并且即支持以函数形式编写单元测试也支持以类为形式编写,还支持以包的形式运行,这样以来就易于与jenkins集成成单元测试集进行持续集成
易于与Jenkins集成体现在如下方面:
1 skip功能可以改变测试用例执行顺序
2 Attrib 标记,用于筛选用例,选择指定标记的测试用例执行
3 Xunit: 以xunit格式输出结果,nose中—-with-xunit默认输出的XML是nosetests.xml文件名,当Jenkins安装了xunit的插件时,就能展示单元测试的结果在Jenkins上了
4 测试覆盖率: nose 中 加上 –with-coverage就能输出nose的单元测试用例对执行应用目录的测试覆盖率
flask 应用的单元测试
一般而言flask应用的单元测试涉及model层测试实例(即与DB打交道),webAPI测试实例(即view层)还有各种后端的module,class, 以及func的单元测试实例
module层的测试实例编写可以考虑使用pytest的fixture或者nose
view层的api测试实例编写可以考虑使用webtest,其提供了get,post,put等request的功能
单元测试与jenkins集成(CI)
若使用nose框架,所有的单元测试案例都可以组织成包形式,nose框架使用nosetests 命令调用指定路径下的包的测试用例的执行,建立CI任务就封装一条执行命令即可。并且使用xunit插件可以直接展示单元测试集的结果在jenkins页面上。
单元测试覆盖率(code coverage)
若使用nose框架, 直接使用该框架提供的 –with-coverage plugin 就能很方便获取测试覆盖率信息