单元测试框架unitest和自动化测试高级应用

发表于:2017-6-27 13:07

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

 作者:王丽松    来源:51Testing软件测试网采编

  单元测试框架:为了让单元测试代码更容易维护和编写,遵循一定的规范来编写测试用例
  创建被测类calculator.py   
  #计算器
  class count:
      def _init_(self,a,b)
          self.a = int(a)
          self.b = int(b)
       #计算加法
      def add(self):
         return self.a + self.b
  通过unittest单元测试框架编写单元测试用例  test.py
 from calculator import count
  import unitest
  class TestCount(unitest.TestCase):
      def setUp(self):
          print("test start")
      def test_add(self):
          j = count(2,3)
          self.assertEqual(j.add(),5)
      def tearDown(self):
          print("test end") 
  if _name_ == '_main_':
      unittest.main()
  说明:1.首先引入unitest模块,创建testcount类继承unitest的testcase类。
        2.setUp():用于测试用例执行前的初始化工作,与tearDown()相呼应,用于执行后的善后工作。
        3.test_add中调用count类并传入要计算的数,通过调用add()方法得到两数相加的返回值,
        这里不再使用繁琐的异常处理,而是调用unitest框架所提供的assertEqual()对add()的返回值进行断言
        判断两者是否相等。assertEqual()方法是由testcase类继承而来的。
        4.main():unitest提供了全局的main()方法,使用它可以方便的将一个单元测试模块变成可以直接运行的测试脚本。
          main()方法使用Testloader类来搜索所有包含在该模块中以“test”命名开头的测试方法。
        5._name_:作为模块的内置属性,简单地说就是.py文件的调用方式。.py文件有两种使用方式
               作为模块调用和直接使用,如果它等于“_main_”就表示是直接使用
  1.重要概念
  1.TestCase:一个TestCase的实例就是一个测试用例,是一个完整的测试流程,包括测试前准备环境的搭建(setUp),
                      实现测试过程的代码(run),测试后环境的还原(tearDown).
  2.Test Suite:把多个测试用例集合在一起来执行。可以通过addTest加载TestCase到Test Suite中,从而返回一个TestSuite实例。
  3.Test Runner:测试的执行,通过TextTestRunner类提供的run()方法来执行Test Suite/TestCase。Test Runner可以使用图形界面,
                          文本界面,或者返回一个特殊的值的方式来表示测试执行的结果。
  4.Test Fixture:对一个测试用例环境的搭建和销毁。通过覆盖TestCase的setUp()和tearDown()方法来实现。tearDown()为下一个
                         测试用例提供一个干净的环境。
  from calculator import count
  import unitest
  class TestCount(unitest.TestCase):
      def setUp(self):
          print("test start")
      def test_add(self):
          j = count(2,3)
          self.assertEqual(j.add(),5)
     def test_add2(self):
          j = count(7,8)
          self.assertEqual(j.add(),15)
      def tearDown(self):
          print("test end") 
  if _name_ == '_main_':
      unittest.main()
  #构建测试集
  suite = unittest.TestSuite()
  suite.addTest(TestCount("test_add2"))
  #执行测试
  runner = unittest.TextTestRunner()
  runner.run(suite)
  本例只执行第二个测试用例,1.调用unittest框架的TestSuite()来创建测试套件。
                        2.通过它所提供的addTest()方法来添加测试用例test_add2。
                        3.调用unitest框架的TextTestRunner().
                        4.通过它下面的run()方法来运行suite所组装的测试用例。
  2.断言方法
  unittest框架的TestCase类提供的断言方法用于测试结果的判断
  1. 格式:-assertEqual(first,second,msg=None)
  断言第一个参数和第二个参数是否相等,如果不相等则测试失败,msg为可选参数,用于定义测试失败时打印的信息。
  比如:self.assertEqual(j.add(),15,msg="测试结果不等于15")
  格式:-assertNotEqual(first,second,msg=None)则与之相反
  2. 格式:-assertTrue(expr,msg=None)
                   -assertFalse(expr,msg=None)
             测试表达式是true(或false)
  创建count.py用于判断质数的
def is_prime(n):
      if n<=1:
          return False
     for i in range(2,n):
          if n % i = = 0:
              return False
    retun True
  测试用例:调用is_prime()函数和unittest
  self.assertTrue(is_prime(7),msg="is not prime")
  3. 格式:-assertIn(first,second,msg=None)
                -assertNotIn(first,second,msg=None)
  断言第一个参数是否在第二个参数中,就是第二个参数是否包含第一个参数。
  测试用例(部分):
  def test_case(self):
      a = "hello"
      b = "hello world"
      self.assertIn(a,b,msg="a is not in b")
  4.格式:-assertIs(first,second,msg=None)
               -assertIsNot(first,second,msg=None)
         断言第一个参数和第二个参数是否为同一对象
  5.格式:-assertIsNone(expr,msg=None)
              -assertIsNotNone(expr,msg=None)
         断言表达式是否为None对象
  6.格式:-assertIsInstance(obj,cls,msg=None)
               -assertNotIsInstance(obj,cls,msg=None)
          断言obj是否为cls的一个实例
  3.组织单元测试用例
    方法1.setUp()和setDown方法分别作用于每个测试用例的开始和结束
    方法2.如果每个类中的setUp()和setDown方法所做的事情是一样的,那么可以封装成一个自己的测试类
  4.discover更多测试用例
    如果单元测试用例达到成百上千个,可以将这些用例按照所测试的功能进行拆分,分散到不同的测试文件中
    最后再创建用于执行所有测试用例的runtest.py文件。
    方法1:可以通过addTest()加载TestCase到TestSuite中。用于少量的测试用例
    方法2:使用TestLoader类提供的discover()方法来加载所有的测试用例。正常情况下,不需要创建这个类的实例,
                unittest提供了可以共享的defaultTestLoader类,可以使其子类和方法创建实例,discover()方法就是其中之一。
        格式:discover(start_dir,pattern='test*.py',top_level_dir=None)
                  start_dir:要测试的模块名或测试用例的目录
                 pattern='test*.py':表示用例文件名的匹配原则,此处文件名以“test”开头的“.py”类型的文件,“*”表示任意多个字符。
                 top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None.
  5.用例执行的原则
  unittest框架默认根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以TestAdd会优于
  TestBdd类被执行,test_aaa()方法会优于test_ccc被执行,因而它并没有按照用例从上到下的顺序执行。对于
  测试目录和测试文件来说,unittest框架同样是按照这个规则来加载测试用例的。
  如果按照指定的顺序执行,可以通过TestSuite类的addTest()方法按照一定得顺序加载。不能默认main()方法了。
  构造测试集,然后通过run()方法执行测试。
  注意:discover()的加载测试用例的规则与main()方法相同,所以只能通过测试用例的命名来提高被执行的优先级。
  6.执行多级的用例
  discover()方法中的start_dir只能加载当前目录下的.py文件,如果加载子目录下的.py文件,需在每个子目录下放
  一个_init_.py文件。
  7.跳过测试和预期失败
  unittest提供了实现某些需求的装饰器,在 执行测试用例时每个装饰前面加@符号。
  unittest.skip(reason):无条件的跳过装饰的测试,说明跳过测试的原因
  unittest.skipIf(condition,reason):跳过装饰的测试,如果条件为真。
  unittest.skipUnless(condition,reason):跳过装饰的测试,除非条件为真。
  unittest.expectedFailure():测试标记为失败,不管执行结果是否失败,统一标记为失败,但不会抛出错误信息。
  8.fixtures
  fixtures可以形象的把他看作是夹心饼干外层的两片饼干,这两片饼干就是setUp/tearDown,中间的心就是测试用例,
  除此以外,unittest还提供了更大范围的fixtures,例如对于测试类和模块的fixtures。
  setUpModule/tearDownModule:在整个模块的开始和结束时被执行。
  setUpClass/tearDownClass:  在测试类的开始和结束时被执行。
  setUp/tearDown:在测试用例的开始与结束时被执行
  注意:setUpClass/tearDownClass的写法稍有不同,首先通过@classmethod进行装饰,其次方法的参数为cls,也可以是别的。
            每一个上面都要进行装饰
  自动化测试高级应用
  9.HTML测试报告
  HTMLTestRunner是python标准库unittest单元测试框架的一个拓展,它生成易于使用的HTML测试报告。
  HTMLTestRunner下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html
  这个拓展只有一个HTMLTestRunner.py文件,选中后单击鼠标右键,在弹出的快捷菜单中选择目标另存为,
  将它保存到本地。安装方法是将其复制到python安装目录下即可。
  windows:将下载的文件保存到...\python35\Lib目录下
  Ubuntu:以root身份将HTMLTestRunner.py文件复制到/usr/local/python3.4/dist-packages/目录下。
  HTMLTestRunner.py文件是基于python2开发的,若要支持python3 环境需要对其中的部分内容进行修改。
  生成测试报告的步骤:
  1.将HTMLTestRunner模块用import导入进来
  2.通过open()方法以二进制写模式打开当前目录下的result.html,如果没有,则自动创建该文件。
  3.调用HTMLTestRunner模块下的HTMLTestRunner类,stream指定测试报告文件,title用于定义测试报告的标题,
     description用于定义测试报告的副标题。
  4.最后,通过HTMLTestRunner的run()方法来运行测试套件中所组装的测试用例。
  5.通过close()关闭测试报告文件。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号