Python web的单元测试搭建

发表于:2018-1-10 11:57

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:leanote    来源:个人博客

  单元测试编写原则
  1.一个单元测试应该易于构造和执行
  2.一般以一个函数为单位进行单元测试的构造
  3.对于一个函数的多种输入输出实例,需要按照等价原则设计相应的单元测试
  单元测试框架
  目前主流的python单元测试框架是pytest以及nose,两者都是在python的库unittest基础之上封装的更易用的unittest framework。
  unittest
  先介绍一下pytest/nose的基础unittest库。 
  unittest原名为PyUnit,是由javaJUnit衍生而来。对于单元测试,需要设置预先条件,对比预期结果和实际结果。 
  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 就能很方便获取测试覆盖率信息
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号