python---Unittest框架

unitTest框架

image-20231127200514732

断言:判断实际结果与预期结果是否相同,类似于验证。

UnitTest框架

  • 什么是UnitTest框架?

    概念:python自带单元测试框架,用它做单元测试。
    ----
    自带的框架:不需要单外安装,就可使用random、json、time
    第三方:需要安装再使用(pytest)
    ----单元测试框架:主要做单元测试,unittest的作用是自动化脚本(用例代码)执行框架,【使用unittest框架来管理运行多个测试用例的】selenium、appium、requests
    
  • 为什么使用UnitTest框架?

1.能够组织多个用例去执行
2.提供丰富的断言方法(让程序代码代替人工判断验证)
3.能够生产测试报告
  • UnitTest核心要素(组成)
1.testcase【最核心的模块】
测试用例,是这个框架的组成部分,不是我们所用的测试用例
主要作用:每个testcase都是一个代码文件,在这个代码中来书写真正的用例代码
2.testSuite
测试套件,用来管理(打包)多个testcase(测试用例)的
3.TestRunner
测试执行,测试运行,用来执行testSuite【测试套件】
4.TestLoader
测试加载,功能是对testSuite测试套件功能的补充,管理组装打包多个Testcase【测试用例】的
5.Fixture
测试夹具,书写在TestCase测试用例代码中,是一个代码结构,可以在每个方法执行后都会执行的内容

举例:
登录的测试用例
1.打开浏览器
2.输入网址
前面1,2条是必须要做的,可以把这两条放进fixture代码结构中,就不需要每次都在testcase书写

TestCase(测试用例)

  • 步骤

    1.导包(unittest)
    2.自定义测试类
    3.在测试类中书写测试方法
    4.执行用例
    
  • 代码

"""
学习测试用例模块的方法
"""
# 1.导包
import unittest
# 2.自定义测试类,需要继承testcase类
class TestDemo (unittest.TestCase):
    #3.书写测试方法,目前没有真正的用例代码,用print代替
    #测试方法必须要以test_开头
    def test_method1(self):
        print("测试方法1")
    def test_method2(self):
        print("测试方法2")
# 4.执行测试方法(测试用例)
#将光标放在类名后面运行代表运行整个类里面的所有代码
#将光标放在方法名后面运行代表运行该方法里面的代码

TestSuite(测试套件)和TestRunner(测试执行)

  • 步骤

    1.导包(unitcase)
    2.实例化(创建对象)套件对象
    3.使用套件对象添加用例方法
    4.实例化运行对象
    5.使用运行对象去执行套件对象
    
  • 代码

    # 1.导包(unitcase)
    import unittest
    from day05.hm_02_TestCase1 import TestDemo1
    from day05.hm_03_TestCase2 import TestDemo2
    # 2.实例化(创建对象)套件对象
    suite=unittest.TestSuite()
    # 3.使用套件对象添加用例方法
    #方式一 ,套件对象.addTest(测试类名(‘方法名'))#建议测试类名和方法名直接去复制不要手写
    suite.addTest(TestDemo1('test_method1'))
    suite.addTest(TestDemo1('test_method2'))
    suite.addTest(TestDemo2('test_method22'))
    suite.addTest(TestDemo2('test_method20'))
    
    #方式二 直接将整个类里面的测试方法一起加进去
    #套件对象.addTest(unittest.makeSuite(类名))
    suite.addTest(unittest.makeSuite(TestDemo1))
    suite.addTest(unittest.makeSuite(TestDemo2))
    # 4.实例化运行对象
    runner=unittest.TextTestRunner()
    # 5.使用运行对象去执行套件对象
    #运行对象.run(套件对象)
    runner.run(suite)
    

image-20231128102835597

登录案例1

image-20231128144645061

#导包
import unittest
from day05.login import login
#自定义测试类
class TestDemo(unittest.TestCase):
    def test_method1(self):
        if login('admin',123456)=='登录成功':
            print('pass')
        else:
            print('正确的用户名和密码,登录成功')
    def test_method2(self):
        if login('root',123456)=='登录失败':
            print('pass')
        else:
            print('错误的用户名,登录失败')
    def test_method3(self):
        if login('admin',123123)=='登录失败':
            print('pass')
        else:
            print('错误的密码,登录失败')
    def test_method4(self):
        if login('aaa',123123)=='登录失败':
            print('pass')
        else:
            print('错误的用户名和密码,登录失败')

TestLoader(测试加载)

测试加载,作用和TestSuite得作用是一样得,对TestSuite功能得补充,用来组装测试用例的
比如:测试用例TestCase文件有很多(10,20,30)
步骤:
1.导包
2.实例化测试加载对象并添加用例-----》得到的是suite对象
3.实例化运行对象
4.运行对象执行套件对象[runner.run(文件对象)]
  • 代码

    # 1.导包
    import unittest
    # 2.实例化测试加载对象并添加用例
    #unittest.Testloader().discover("文件路径","用例的文件名字")
    #文件名字可以使用通配符
    # suite=unittest.TestLoader().discover("./case",'hm*.py')
    suite=unittest.TestLoader().discover("./case",'*.py')
    # 3.实例化运行对象
    runner=unittest.TextTestRunner()
    # 4.运行对象执行套件对象
    runner.run(suite)
    

FIxture(测试夹具)

是一种代码结构,在某些特定的情况下,会自动执行
  • 方法级别

    在每个测试方法(用例代码)执行前后都会自动调用的结构
    
    #方法执行之前
    def setup(self):
        每个测试方法执行之前都会执行
        pass
    
    测试方法代码写在这个中间
    
    #方法执行之后
    def teardown(self):
        每个测试方法之后都会执行
        pass
    
  • 类级别

    在每个测试类中所有方法执行前后,都会自动调用的结构(在整个类中执行之前执行之后各一次)
    
    #类级别的FixTure方法,是一个类方法
    #类中所有方法之前
    @classmethod
    def setupClass(csl):
        pass
    
    #类中所有方法之后
    @classmethod
    def teardownClass(csl):
        pass
    
  • 模块级别

    模块:代码文件
    在每个代码文件执行前后执行的代码结构
    
    #模块级别的需要写在类的最外边直接定义函数即可
    #代码文件之前
    def setupModule():
        pass
    #代码文件之后
    def teardownModule():
        pass
    

登录案例2

1.打开浏览器(整个测试过程只需要打开一次浏览器)类级别
2.输入网址(每个测试方法都需要一次)方法级别
3.输入用户名密码验证码点击登录(不同的测试数据)测试方法
4.关闭当前页面(每个测试方面都需要一次)方法级别
5.关闭浏览器(整个测试过程只需要关闭一次浏览器)类级别
--------
1.打开浏览器(整个测试过程只需要打开一次浏览器)类级别
2.输入网址(每个测试方法都需要一次)方法级别
3.输入用户名密码验证码点击登录(不同的测试数据)测试方法
4.关闭当前页面(每个测试方面都需要一次)方法级别
2.输入网址(每个测试方法都需要一次)方法级别
3.输入用户名密码验证码点击登录(不同的测试数据)测试方法
4.关闭当前页面(每个测试方面都需要一次)方法级别
2.输入网址(每个测试方法都需要一次)方法级别
3.输入用户名密码验证码点击登录(不同的测试数据)测试方法
4.关闭当前页面(每个测试方面都需要一次)方法级别
5.关闭浏览器(整个测试过程只需要关闭一次浏览器)类级别

断言

断言结果有两种:
1.true---用例通过
2.false----代码抛出异常,用例不通过
在unnittest框架中,都需要通过self.断言方法来使用

assertEqual

self.arrestEqual (预期结果,实际结果) #判断预期结果和实际结果是否相等
1.如果相等,用例通过
2.如果不相等,用例不通过,抛出异常

arrertlh

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

登录案例3断言

#导包
import unittest
from day05.login import login
#自定义测试类
class TestDemo(unittest.TestCase):
    def test_method1(self):
        self.assertEqual('登录失败',login('admin',123456))
    def test_method2(self):
        self.assertEqual('登录失败', login('root', 123456))
    def test_method3(self):
        self.assertEqual('登录失败', login('admin', 123123))
    def test_method4(self):
        self.assertEqual('登录失败', login('root', 123123))

参数

参数化

工作中的场景:
1.测试数据一般般在json文件中
2.使用代码读取json文件,提取我们想要的数据----》[(),()]or [[],[]]

安装插件

unittest框架本身不支持参数化,需要安装插件完成
---联网安装
pip install parameterized(cmd或者python终端)
----
pip 是python中包(插件)的管理工具,使用这个工具下载安装插件

参数化代码

1.导包unittest/pa
2.定义测试类
3.书写测试方法(用到的测试数据使用变量代替)
4.组织测试数据并传参
# 1.导包unittest/pa
import unittest
from parameterized import parameterized

from day05.login import login
# 4.组织测试数据并传参
#组织测试数据[(),(),()]
data =[
    ('admin','123456','登录成功'),
    ('root','123456','登录失败'),
    ('admin','123123','登录失败')
]

# 2.定义测试类
class TestLogin(unittest.TestCase):
    # 3.书写测试方法(用到的测试数据使用变量代替)
    @parameterized.expand(data)#这里进行传参
    def test_login(self,username,password,expect):
        self.assertEqual(expect, login(username, password))

# 4.组织测试数据并传参

参数化2

在json文件里面写代码,然后进行引入数据

[
  {
    "desc": "正确的用户名和密码",
    "username": "admin",
    "password": "123456",
    "excpet": "登录成功"
  },
  {
    "desc": "错误的用户名",
    "username": "root",
    "password": "123456",
    "excpet": "登录失败"
  },
{
    "desc": "错误的密码",
    "username": "admin",
    "password": "123123",
    "excpet": "登录失败"
  }
]
# 1.导包unittest/pa
import json
import unittest
from parameterized import parameterized

from day05.login import login
# 4.组织测试数据并传参
#组织测试数据[(),(),()]
def bulid_data():
    with open("data.json",encoding='utf-8') as f:
        result=json.load(f)
        list=[]
        for i in result:
            list.append((i.get('username'), i.get('password') , i.get('excpet')))
    return list

# 2.定义测试类
class TestLogin(unittest.TestCase):
    # 3.书写测试方法(用到的测试数据使用变量代替)
    @parameterized.expand(bulid_data())#这里进行传参
    def test_login(self,username,password,expect):
        self.assertEqual(expect, login(username, password))

# 4.组织测试数据并传参

跳过

对于一些未完成的或者不满足测试条件的测试函数和测试类,不想执行,可以使用跳过使用方法,装饰器完成
代码书写在TestCase文件里面
#直接在测试函数标记成跳过
@unittest.skip('跳过的原因')
#根据条件判断测试函数是否跳过,判断条件成立,跳过
@unittest.skipIf(判断条件,'跳过原因')
import unittest

class TestDemo(unittest.TestCase):
    @unittest.skip('没有什么原因,就不想测试1')
    def test_method1(self):
        print('测试方法1')
    def test_method2(self):
        print('测试方法2')
    def test_method3(self):
        print('测试方法3')

image-20231130202318592

测试报告

自带的测试报告

只有单独运行TestCase的代码,才会生成测试报告

image-20231130202757051

image-20231130202822623

第三方测试报告

1.获取第三方的测试运行类模块,将其放在代码的目录中
2.导包unittest
3.使用 套件对象,加载对象 去添加用例方法
4.实例化 第三方的运行对象并运行套件对象
# 1.获取第三方的测试运行类模块,将其放在代码的目录中
# 2.导包unittest
import unittest
from HTMLTestRunner import HTMLTestRunner
# 3.使用 套件对象,加载对象 去添加用例方法
suite=unittest.defaultTestLoader.discover('.','hm_04_pa.py')
# 4.实例化 第三方的运行对象并运行套件对象
HTMLTestRunner()

image-20231201225719279

1.组织用例文件(TestCase里边),书写参数化,书写断言,书写Fixtrue,书写跳过,如果单个测试测试文件,直接运行,得到测试报告,如果有多个测试文件,需要组装运行生成测试报告。
2.使用套件对象组装,或者使用加载对象组装
3.运行对象 运行
3.1 运行对象=第三方的运行类(文件对象(打开文件需要使用wb方式))
3.2 运行对象.run(套件对象)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值