unittest框架快速入门

 
  附自己的selenium博客,可结合unittest使用:Selenium常用API
 

一、Pycharm运行方式

  1. 以脚本的方式运行
      在Pycharm中,平常默认就是以脚本的方式运行,除非使用了测试框架,否则都是以脚本的方式运行(Run xxx)

  1. 以unittest框架运行
      当我们使用unittest框架的时候,就可以以unittest框架来运行相应的测试类或测试用例(Run Unittests in xxx)

  1. 以其他测试框架运行
      默认情况下,Pycharm的配置是用unittest框架(Python自带),如果我们装了其他框架(如pytest),可以通过修改设置来使用测试框架运行。
      修改配置的方法:
        File  →  Settings  →  Tools  →  Python Integrated Tools  →   Testing下的Default test runner  →  选择对应框架

 

二、unittest四大特性

  1. TestCase
      unittest提供了TestCase这个类,所有的测试类都要继承这个类,并且每个方法(即测试用例)都要以test开头,unittest框架执行的时候就会去找这些以test开头的方法,然后执行。
      那么,没有以test开头的方法,就是平时类里面的普通方法,不会当做测试用例,所以一般可以用来当做接口,供测试用例来调用。
     
      需要说明的是,默认测试用例的执行顺序是按照ASCII码表的顺序执行的,并且unittest支持只执行单个测试用例(Pycharm中通过把光标放在方法(即测试用例)上右键Run)
      unittest标记测试用例的运行结果的形式:
        成功为.(点) ,失败为F,出错为E,跳过为s,预期失败为x,意想不到的成功为u
     
  2. TestFixture
      通常我们在执行测试用例前和后,都要做一些初始化或者清理工作,unittest提供了TestFixture给我们使用,包括以下几个方法:
      (1) setUp():每个测试用例执行前都会调用这个函数,一般用于初始化操作
      (2) tearDown():每个测试用例执行后都会调用这个函数,一般用于清理操作
      (3) setUpClass():所有测试用例执行前都会调用这个函数,一般用于初始化操作
      (4) tearDownClass():所有测试用例执行后都会调用这个函数,一般用于清理操作
     
      可以看出,setUp()tearDown()的特点是有多少条测试用例,就会执行多少次。而setUpClass()tearDownClass()在整个过程只会在执行一次
      另外,setUpClass()tearDownClass()在使用的时候,要在相应的方法(测试用例)前加上 @classmethod 装饰器。
      整个执行顺序如下:

  1. TestSuite
      unittest提供TestSuite(测试套件)给我们使用,让我们能够执行大量的测试用例,并且可以按照自己定义的顺序执行(而不是原来按照ASCII码表的顺序)。
      为了方便,下面用suite = unittest.TestSuite(),module 表示 测试类所在的模块名,class 表示 具体测试类, method 表示 具体方法(即测试用例),主要有以下几种运用形式:
      (1) suite.addTest(class("method"))
        这个方法可以一个个的添加具体测试用例,并且按照添加的顺序来执行。
     
      (2) suite.addTests([class("method"), class("method"), ...])
        这个方法可以用来批量添加测试用例,和上面类似,只不过传递的是一个列表,
        列表里的每一项就是具体的测试用例。
     
      在介绍下面的方法前,先说明一个东西:defaultTestLoader = TestLoader()
      下面就是证明:
    import unittest
    
    print(type(unittest.defaultTestLoader))  # <class 'unittest.loader.TestLoader'>
    print(isinstance(unittest.defaultTestLoader, unittest.TestLoader))  # True
    

     说这个主要为了提醒大家,使用的时候,如果使用unittest.TestLoader要记得实例化
     或者就直接用;defaultTestLoader,否则肯定会报错的。
 
     注:下面的所有方法都是返回TestSuite对象,既可以直接使用,也可以先实例化一个
       TestSuite对象,然后通过addTest()或addTests()的方式添加

 
     (3) unittest.defaultTestLoader.discover(start_dir, pattern)
         这个方法可以用来运行目录下的对应文件里所有的测试用例,其中start_dir表示为开始寻找的目录位置,pattern为匹配
     模式,用正则表达式,比如"test*.py"表示运行所有以test开头的py文件里面的测试用例。
         如果不用defaultTestLoader,就要写 unittest.TestLoader().discover()
 
     (4) unittest.defaultTestLoader.loadTestsFromTestCase(module.class)
         参数为测试类(继承了unittest.TestCase的)
 
     (5) unittest.defaultTestLoader.loadTestsFromModule(module)
         参数为测试用例所在的模块
 
     (6) unittest.defaultTestLoader.loadTestsFromName("module.class.method")
         参数为具体测试用例,需要注意的是:要加上引号
 
     (7) unittest.defaultTestLoader.loadTestsFromNames(["module.class.method", ...])
         同上,只不过传的是列表
 

  1. TestRunner
      上面TestSuite只是把所有要用到的测试用例放在了一起,并没有实现用例的执行,所以TestRunner就是用来配合TestSuite使用的。
      其中unittest自带的有 TextTestRunner ,通过调用其run(suite)方法来运行相应的测试套件。这个自带的比较简单,我们可以自己去下载网上很多写好的  HTMLTestRunner 的py文件,用来生成Html形式的报告。这个扩展性比较高,可以自己去摸索,也有生成中文的,各种各样的,甚至可以自己按照自己想要的方式定制。
     

三、断言

  断言是测试的精髓,没有断言就没有灵魂。写测试用例就是为了去检测能否达到预期的要求,如果不断言,根本就不知道这条测试用例到底算不算通过。
  unittest提供了非常多的断言,种类丰富,但是常用的也就几个,比如assertEqual()、assertIn()等,另外它们都有一个msg参数,如果断言不通过,就可以在测试报告中看到这个信息。

 

四、跳过用例 & 预期失败

  有的时候,我们可能暂时不需要执行某些测试用例(比如已经测试完注册的接口,后面只需要登录去做别的测试,我们就可以跳过注册这个测试用例),或者知道某些测试用例有可能会执行失败,我们就可以通过跳过用例和标记为预期失败来完成上述的操作。
  unittest跳过用例和预期失败都是通过 装饰器 来完成的。

  1. @unittest.skip(reason: str)
      无条件跳过,说明要跳过测试的原因

  2. @unittest.skipIf(condition: object, reason: str)
      有条件跳过,当条件为真(True)时,才会跳过测试,并说明要跳过测试的原因

  3. @unittest.skipUnless(condition: object, reason: str)
      有条件跳过,当条件为假(False)时,才会跳过测试,并说明要跳过测试的原因

  4. @unittest.expectedFailure
      标记这个测试为预期失败,如果这个测试不通过,不会算作失败(即会标记为passed)
      注意:只有这个装饰器不需要传参,不要加上括号,否则会报错

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值