unittest框架

什么是框架?

框架英文单词framework,为解决一类事情的功能集合。需要阿钊框架的规定去书写代码

什么是unittest框架

unittest是python自带的单元测试框架。

和pytest框架的区别:pytest框架是需要另外单独安装的

对于测试来说,他的作用是执行用例代码的框架。也就是说使用unittest框架来管理,运行多个测试用例的

TestCase(测试用例)

每个TestCase都是一个代码文件,在这个代码文件中,书写真正的用例代码

TestCase注意事项:

  • 测试用例类需要继承unittest.TestCase
  • 测试方法必须以test开头
  • 代码文件的名字必须按照标识符的规则来书写
  • 文件内容的开头,使用注释说明该文件的作用

代码示例:

import unittest#导包

class TestDemo(unittest.TestCase):#继承了testcase
    def test_case01(self):pass#方法名需要以test开头
        
    def test_case02(self):pass

 

TestSuite(测试套件)

testsuite是把测试用例汇总起来,需要配合TestRunner一起使用才能运行

复制代码
import unittest

suite = unittest.TestSuite()#先将testsuite实例化,拿到一个suite对象

# 添加测试用例的方式有多种
#第一种添加方式,直接将测试用例类中的所有测试方法添加进来
suite.addTest(unittest.makeSuite(要执行的测试用例类名))

#第二种添加方式,一次添加一条用例,效率低。但是可以结合*(通配符)使用。
suite.addTest(测试类名('方法名'))
复制代码

 

TestRunner(测试执行)

注意点:

  • 实例化执行对象时,unittest后面的是TextTestRunner()
import unittest
suite = unittest.TestSuite()#先将testsuite实例化,拿到一个suite对象
suite.addTest(unittest.makeSuite(要执行的测试用例类名))#添加测试用例

runner = unittest.TextTestRunner()#实例化一个执行对象
runner.run(suite)#调用执行对象中的run方法,将添加完测试用例的测试套件作为参数传过去。

 

TestLoader(测试加载)

TestLoader是什么:TesetLoader(测试加载),作用和TestSuite是一样的,是对TestSuite的补充,用来组装测试用例的

什么场景使用testloader:比如testcase的代码文件有很多

复制代码
import unittest
#加上discover返回的是一个suite对象,不加的话是返回的是一个testloader对象。
#discover是查找的意思。
#接收两个参数,分别是用例路径和用例的文件名。
# 用例路径推荐使用相对路径;文件名可以结合通配符使用。如:test*,*.py。
suite = unittest.TestLoader.discover('用例所在的路径','用例的代码文件名')

# 这样写和前面也是一样的效果
suite = unittest.defaultTestLoader('用例所在的路径','用例的代码文件名')

runner = unittest.TextTestRunner()
runner.run(suite)
复制代码

 

FixTure(测试夹具)

是一种代码结构

下面这些方法的名字是固定的,必须要这么写,且大小写也要保持一致。因其本质是重写了父类的方法,所以名字一定要保持一样。否则就不是重写的意义了。

方法级别的

在每个测试方法(测试用例)执行之前/之后都会自动调用的结构

代码示例

复制代码
import unittest
class TestDemo(unittest.TestCase):
    def setUp(self):#在每个测试用例执行之前会先执行setUp里面的内容
        print('------setUp里面的内容-------')

    def tearDown(self):#在每个测试用例执行之后,会执行tearDown里面的内容
        print('------tearDown里面的内容------')

    def test_case01(self):
        print('第一条测试用例')

    def test_case02(self):
        print('第二条测试用例')

执行结果:
Ran 2 tests in 0.006s

OK
------setUp里面的内容-------
第一条测试用例
------tearDown里面的内容------
------setUp里面的内容-------
第二条测试用例
------tearDown里面的内容------

Process finished with exit code 0
复制代码

 类级别的

在每个测试类中所有方法执行前后 都会自动调用的结构(在整个类执行之前和执行之后各一次)

复制代码
import unittest
class TestDemo(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print('-----类中方法执行前-----')

    @classmethod
    def tearDownClass(cls):
        print('-----类中方法执行后-----')

    def test_case01(self):
        print('第一条测试用例')

    def test_case02(self):
        print('第二条测试用例')

执行结果
OK

-----类中方法执行前-----
第一条测试用例
第二条测试用例
-----类中方法执行后-----

Process finished with exit code 0
复制代码

 模块级别的fixture

在每个代码文件执行前后执行的代码结构

  什么是模块:每个代码文件都是一个模块

复制代码
import unittest

def setUpModule():#在模块执行之前会先执行这个方法中的代码。方法名必须是这个
    print('---在模块执行前先执行这句话---')
    
def tearDownModule():#在模块执行之后会执行这个方法中的代码。方法名必须是这个
    print('---在模块执行之后要执行这句话')

class TestDemo(unittest.TestCase):
    def test_case01(self):
        print('第一条测试用例')

    def test_case02(self):
        print('第二条测试用例')

执行结果:
OK
---在模块执行前先执行这句话---
第一条测试用例
第二条测试用例
---在模块执行之后要执行这句话

Process finished with exit code 0
复制代码

 断言

什么是断言?

让程序代替认为判断测试程序执行结果是否符合预期结果的过程

百度百科介绍:断言(assertion)是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑判断式),目的为了表示与验证软件开发者预期的结果——当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息。

assertEqual

        self.assertEqual('预期结果','实际结果')#判断预期结果和实际结果是否相等。相等,用例通过;不相等,用例不通过,抛出异常。

assertIn

        self.assertIn('预期结果', '实际结果')  # 判断预期结果是否包含在实际结果中
        # 包含,用例通过,不包含,用例不通过,抛出异常

 

 参数化

unittest框架本身是不支持参数化的,想使用参数化,需要安装插件来完成。

下载方法一:pip install parameterized

下载方法二:pycharm中下载

下载完成如何验证

验证方法一:pip list。会显示所有的插件,如果这里面有parameterized说明安装成功了

验证方法二:导包验证,找个python文件import一下,如果有提示就说明安装成功了

使用参数化实例

 

 跳过

对于一些未完成的或者不满足测试条件的测试函数和测试类。不想执行它,可以使用跳过的方法。使用装饰器完成。

跳过的两种方式

直接跳过@unittest.skip()

给要跳过的测试用例加上装饰器@unittest.skip()

符合条件的跳过@unittest.skipIf()

在想要跳过的测试用例前面增加装饰器@unittest.skipIf()

skipIf()接收两个参数:1.条件表达式。2.跳过原因

代码演示:

复制代码
import unittest

version_code = 30


class TestDemo(unittest.TestCase):
    @unittest.skip('跳过原因')  # 直接将测试用例标记成跳过
    def test_case01(self):
        print('test_case01')

    # skipIf()根据条件判断测试函数是否跳过,符合条件就跳过。
    # skipIf方法接收两个参数。首先是判断表达式,其次是跳过的原因
    @unittest.skipIf(version_code > 1, '版本号大于1,所以不执行')
    def test_case02(self):
        print('test_case02')

    def test_case03(self):
        print('test_case03')

执行结果:
OK (skipped=2)

Skipped: 跳过原因

Skipped: 版本号大于1,所以不执行
test_case03

Process finished with exit code 0
复制代码

 

测试报告

有两种测试报告

第一种是:unittest自带的测试报告

只有单独运行TestCase的代码,才会生成测试报告。通过testrunner执行时不会生成。

第二种是:HTMLTestRunner

需要单独下载,是一个第三方的类库。用来执行测试用例,并生成测试报告。

注意:使用HTMLTestRunner生成报告,就不能使用unittest自带的testrunner了。

 

posted @   邵杠杠  阅读(80)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示