Python单元测试框架unittest/反射

Python单元测试框架unittest/反射

1)写用例 TestCase

2)执行用例 1:TestSuite存储用例,2:TestLoader找用例,存储用例,存放指定的TestSuite

3)对比实际结果/期望结果,判定用例是否通过#断言Assert

4)出局测试报告TextTestRunner

1.测试类

import requests
class HttpRequest():
    def __init__(self, method, url, param=None, headers=None, cookie=None):
        self.method=method#method:请求方式
        self.url=url#url:请求的url
        self.param=param#param:请求参数
        self.headers=headers#headers:请求头
        self.cookie=cookie#cookie:请求的cookie值
    def http_request(self):
        if self.method.lower()=="post":
            return requests.post(self.url,self.param)
        elif self.method.lower()=="get":
            return requests.get(self.url,self.param,headers=self.headers,cookies=self.cookie)
        else:
            print("请求方式错误:{0}".format(self.method))

2.TestCase/断言/异常处理

import unittest#引入unittest框架
from test01.qabujiaban_class import HttpRequest#引入测试类

#编写一个存储测试用例的类
class TestHttp(unittest.TestCase):#用例类继承unittest.TestCase用于编写测试用例
    #正确登陆测试用例
    def test_login_yes(self):#测试用例函数必须test_开头,否则框架无法识别当前是用例
        login_url = "http://www.qabujiaban.com/user/login"
        data = {"username": "uuuu222都44", "password": "WJHasb124*1"}
        res = HttpRequest("Post", login_url, data).http_request()
        print("登陆响应文本:", res.json())  #
        try:
            self.assertEqual("0000", res.json()["code"])  # 断言,期望值==实际值
        except AssertionError as e:
            print("断言错误异常抛出:{0}".format(e))
            raise e#抛出异常
            #错误登陆测试用例
    def test_login_no(self):
        login_url = "http://www.qabujiaban.com/user/login"
        data = {"username": "uuuu222都44", "password": "123456"}#密码错误
        res = HttpRequest("Post", login_url, data).http_request()
        print("登陆响应文本:", res.json())  #
        try:
            self.assertEqual("0000", res.json()["code"])  # 断言,期望值==实际值
        except AssertionError as e:
            print("断言错误异常抛出:{0}".format(e))
            raise e#抛出异常

if __name__ == '__main__':
    unittest.main()#执行全部测试用例
执行结果:

============================= test session starts =============================
platform win32 -- Python 3.7.3, pytest-7.2.0, pluggy-1.0.0
rootdir: C:UsersAdministratorPycharmProjectsdemotest01
plugins: html-3.2.0, metadata-2.0.4collected 2 items

testdemo01.py                                                          [100%]

============================== 2 passed in 0.35s ==============================

Process finished with exit code 0
.登陆响应文本: {'code': '0002', 'message': '登陆失败,密码错误'}
.登陆响应文本: {'code': '0000', 'message': '登陆成功', 'login_time': '2022-59-19 11:12:04', 'create_time': '2021-23-28 04:12:19'}
注意:

执行结果中,E表示错误,F表示失败,  .  点表示成功

3.unittest.addTest()

import unittest
from test01.demo_case import TestHttp#引入测试用例类

suite = unittest.TestSuite()#存储器,存储用例
#第一个用例
suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例
#第二个用例
suite.addTest(TestHttp("test_login_no"))

runner = unittest.TextTestRunner()
runner.run(suite)#执行
执行结果:

.登陆响应文本: {'code': '0000', 'message': '登陆成功', 'login_time': '2022-12-20 12:12:33', 'create_time': '2021-23-28 04:12:19'}
登陆响应文本: {'code': '0002', 'message': '登陆失败,密码错误'}
.
----------------------------------------------------------------------
Ran 2 tests in 0.275s

OK

Process finished with exit code 0

4.loader.loadTestsFromTestCase()

import unittest
from test01.demo_case import TestHttp#引入测试用例类

suite = unittest.TestSuite()#存储器,存储用例
# #第一个用例
# suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例
# #第二个用例
# suite.addTest(TestHttp("test_login_no"))
loader = unittest.TestLoader()#创建加载器
suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载

runner = unittest.TextTestRunner()
runner.run(suite)#执行
执行结果:
登陆响应文本: {'code': '0002', 'message': '登陆失败,密码错误'}
..
登陆响应文本: {'code': '0000', 'message': '登陆成功', 'login_time': '2022-23-20 12:12:16', 'create_time': '2021-23-28 04:12:19'}
----------------------------------------------------------------------
Ran 2 tests in 0.288s

OK

Process finished with exit code 0

5.loader.loadTestFromModule()

import unittest
# from test01.demo_case import TestHttp#引入测试用例类
from test01 import demo_case#引入模块
suite = unittest.TestSuite()#存储器,存储用例
# #第一个用例
# suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例
# #第二个用例
# suite.addTest(TestHttp("test_login_no"))
loader = unittest.TestLoader()#创建加载器
# suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载
suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载

runner = unittest.TextTestRunner()
runner.run(suite)#执行
执行结果:
.登陆响应文本: {'code': '0002', 'message': '登陆失败,密码错误'}
.
----------------------------------------------------------------------
Ran 2 tests in 0.259s

OK
登陆响应文本: {'code': '0000', 'message': '登陆成功', 'login_time': '2022-26-20 12:12:51', 'create_time': '2021-23-28 04:12:19'}

Process finished with exit code 0

6.TextTestRunner()

import unittest
# from test01.demo_case import TestHttp#引入测试用例类
from test01 import demo_case
suite = unittest.TestSuite()#存储器,存储用例
# #第一个用例
# suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例
# #第二个用例
# suite.addTest(TestHttp("test_login_no"))
loader = unittest.TestLoader()#创建加载器
# suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载
suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载

file = open(file="log.txt",mode="w",encoding="utf8")
runner = unittest.TextTestRunner(stream=file,verbosity=2)#stream为日志存储路径,verbosity=0/1/2 打印日志的详细等级,2最详细
runner.run(suite)#执行
file.close()#关闭资源

执行结果:
Python单元测试框架unittest/反射

7.上下文管理器with open()

import unittest
# from test01.demo_case import TestHttp#引入测试用例类
from test01 import demo_case
suite = unittest.TestSuite()#存储器,存储用例
# #第一个用例
# suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例
# #第二个用例
# suite.addTest(TestHttp("test_login_no"))
loader = unittest.TestLoader()#创建加载器
# suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载
suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载

with open(file="log.txt",mode="w",encoding="utf8") as file:#执行完后自动关闭
    runner = unittest.TextTestRunner(stream=file,verbosity=2)#stream为日志存储路径,verbosity=0/1/2 打印日志的详细等级,2最详细
    runner.run(suite)#执行
#print(file.closed)#判断状态,True=关闭
执行结果与open()一致

8.HTMLTestRunnerNew

import unittest
import HTMLTestRunnerNew#引入模板类
# from test01.demo_case import TestHttp#引入测试用例类
from test01 import demo_case
suite = unittest.TestSuite()#存储器,存储用例
loader = unittest.TestLoader()#创建加载器
suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载

with open(file="qabujiaban_report.html",mode="wb") as file:#执行完后自动关闭
    runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file, verbosity=2,title="这里是标题",description="这里写描述",tester="这里写谁测试的")
    runner.run(suite)

生成报告:
Python单元测试框架unittest/反射

9.接口关联传参方式

9.1.反射

class GetDate():
    Cookie="ABCDEFG"

if __name__ == '__main__':
    print(getattr(GetDate,"Cookie"))  #getattr(类名,属性名) 获取指定类的属性值
    setattr(GetDate,"Cookie","三好学生")#修改指定类里的已有属性值
    print(getattr(GetDate,"Cookie"))#三好学生
    print(hasattr(GetDate,"Cookie"))#判断指定类是否有指定属性值
    delattr(GetDate,"Cookie")#删除指定类的已有属性值
    print(hasattr(GetDate,"Cookie"))#False

9.2.全局变量global

9.3.setUp()/tearDown()

import unittest#引入unittest框架
from test01.qabujiaban_class import HttpRequest#引入测试类

#编写一个存储测试用例的类
class TestHttp(unittest.TestCase):#用例类继承unittest.TestCase用于编写测试用例
    def setUp(self) -> None:
        print("每一条用例执行前执行...")
    def tearDown(self) -> None:
        print("每一条用例执行结束后执行...(一般放到用例之后)")
    #正确登陆测试用例
    def test_login_yes(self):#测试用例函数必须test_开头,否则框架无法识别当前是用例
        print("执行用例11111111111111111")
    def test_login_no(self):
        print("执行用例22222222222222222")

if __name__ == '__main__':
    unittest.main()#执行全部测试用例

执行结果:
============================= test session starts =============================
platform win32 -- Python 3.7.3, pytest-7.2.0, pluggy-1.0.0
plugins: html-3.2.0, metadata-2.0.4collected 2 items
demo_case.py .每一条用例执行前执行...
执行用例22222222222222222
每一条用例执行结束后执行...(一般放到用例之后)
.每一条用例执行前执行...
执行用例11111111111111111
每一条用例执行结束后执行...(一般放到用例之后)
                                                          [100%]
============================== 2 passed in 0.10s ==============================
Process finished with exit code 0

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python单元测试框架unittest/反射 - Python技术站

(0)
上一篇 2023年4月2日 下午4:12
下一篇 2023年4月2日 下午4:12

相关文章

  • Python面向对象

      ===面向对象=== 1.面向对象简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 方法:类中定义的函数。 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数…

    2023年4月2日
    00
  • Python控制语句/循环语句

    1.控制语句 1.1.判断语句 if…elif…else #if 语句(比较/逻辑/成员均可) #字符串/列表/元组/字典 为空返回False,非空返回True #条件成立返回True,不成立返回False ar = “” list = [] tuple = () dic = {} if ar:#条件成立返回True继续执行,不成立返回False不执…

    2023年4月2日
    00
  • Python参数解析器configparser

    1.configparser介绍 configparser是python自带的配置参数解析器。可以用于解析.config文件中的配置参数。ini文件中由sections(节点)-key-value组成 2.安装: pip install configparse 3.获取所有的section import configparser cf = configpar…

    2023年4月2日
    00
  • Python unittest+ddt+openpyxl

    1.技术介绍 框架:unittest 请求处理:requests excel数据处理:openpyxl 参数化:ddt 报告模板:HTMLTestRunnerNew.py(下载地址:https://pan.baidu.com/s/1w9AZU9AkIpxCYuzTto0EQA?pwd=1234) testdemo.xlsx:测试数据,注意:implement…

    2023年4月2日
    00
  • Python操作Excel(openpyxl)

    1.引入openpyxl库 安装openpyxl库:pip install openpyxl 引入openpyxl库:from openpyxl import load_worbook 2.代码实现 from openpyxl import load_workbook #打开Excel wb = load_workbook(“C:\Users\Adminis…

    2023年4月2日
    00
  • Pycharm2019.1.3 安装/激活/汉化

    完美流程,提供所有安装包激活码,解决pycharm安装激活问题!建议收藏!!! 1.安装 Pycharm2019.1.3 安装包下载地址: 链接:https://pan.baidu.com/s/10r-sMUJh7YKS_TP05NehCQ?pwd=1234 提取码:1234 1.1.双击运行电脑中已下载好的PyCharm.2019.1.3安装包。还没下载的…

    2023年4月2日
    00
  • Python函数/动态参数/关键字参数

      1.函数 #函数语法: #函数名规范:小谢字母开头,不同字母下划线隔开(字母数字下划线) #def 函数名(): #函数体:希望函数做的事情 1.1.无参函数 #无参函数 def music(): print(“唱着又没动听的歌声…”) #调用函数 music() 1.2.有参函数 #有参函数 def zgl_music(name): #形参 pri…

    2023年4月2日
    00
  • Python unittest数据处理ddt

    1.装饰器 #装饰器的官方定义: 装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。 2.ddt import unittest #引入ddt库 from ddt import ddt,…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部