Python unittest单元测试openpyxl实现过程解析
作者:1142783691 发布时间:2023-06-17 10:54:31
一。初识单元测试
1)定义:
单元:函数或者是类
单元测试:测试类或者函数
python内置的单元测试框架:unittest
2)单元测试的意义
好处:投入小,收益大。能够精准的,更早的发现问题。
3)单元测试与测试关系
python 很难测试 java 的单元。
关键是单元测试一般是开发或者测试开发做的。
测试一般会在集成、系统、验收进行测试
4)unittest的注意事项:
1.模块名需要以 test_ 开头
2.类名:以 Test 开头
3.测试用例的方法名称以 test_ 开头
4.单元测试写入方式(其中TestLogin是测试模块):TestLogin(unittest.TestCase)
5)如何写测试用例
#首先需要引入单元测试框架
import unittest
#login模块校验规则
def login(username=None, password=None):
"""登录"""
if (not username) or (not password):
# 用户名或者密码为空
return {"msg": "empty"}
if username == 'yuz' and password == '123456':
# 正确的用户名和密码
return {"msg": "success"}
return {"msg": "error"}
#单元测试用例
class TestLogin(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
#登录账号与密码为空
def test_login_01_null(self):
username=''
password=''
expected_result={"msg": "empty"}
actual_result=login(username,password)
self.assertTrue(expected_result == actual_result)
#登录账号为空
def test_login_02_usernull(self):
username=''
password='123456'
expected_result={"msg": "empty"}
actual_result=login(username,password)
self.assertTrue(expected_result == actual_result)
#登录密码为空
def test_login_03_passwordnull(self):
username='yuz'
password=''
expected_result={"msg": "empty"}
actual_result=login(username,password)
self.assertTrue(expected_result == actual_result)
#正常登录
def test_login_04_correct(self):
username = 'yuz'
password = '123456'
expected_result = {"msg": "success"}
actual_result = login(username, password)
self.assertEqual(expected_result,actual_result)
#账号输入错误
def test_login_05_usererro(self):
username = 'linzai'
password = '123456'
expected_result = {"msg": "error"}
actual_result = login(username, password)
self.assertTrue(expected_result == actual_result)
#密码输入错误
def test_login_06_usererro(self):
username = 'yuz'
password = '12345698'
expected_result = {"msg": "error"}
actual_result = login(username, password)
self.assertTrue(expected_result == actual_result)
#账号与密码都错误
def test_login_07_userpassworderror(self):
username='linzai'
password='laksls'
expected_result={"msg": "error"}
actual_result=login(username,password)
self.assertTrue(expected_result == actual_result)
#执行方法
if __name__ == '__main__':
unittest.main()
6)测试用例执行顺序
采取ASCII标准按顺序进行执行
二。单元深入了解。(用例执行、组织、收集、运行流程)
1。用例执行
1)右击 unittest 运行(在.py文件中)
2)python 运行 unittest.main()
3) 运行所有的测试用例(控制台直接执行 : python test...py)
2.用例组织
会把测试用例的代码放到一个统一的文件夹当中或者目录当中。
如下:
3.测试用例收集
需要把每个测试用例模块当中的测试用例收集到一起,一起执行。
1)方法一:(创建一个测试用例加载器,使用discover 收集所有用例)
#初始化一个测试用例加载器
loder=unittest.TestLoader()
#先拿到该.py文件的绝对路径
file_path=os.path.abspath(__file__)
#拿到测试模块的路径
case_path=os.path.join(os.path.dirname(file_path),'test')
#使用loder收集所有的测试用例
test_suit=loder.discover(case_path)
print(test_suit)
运行结果(discover收集的内容是一个列表,如下图):
[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_login.TestLogin testMethod=test_login_01_null>, <test_login.TestLogin testMethod=test_login_02_usernull>, <test_login.TestLogin testMethod=test_login_03_passwordnull>, <test_login.TestLogin testMethod=test_login_04_correct>, <test_login.TestLogin testMethod=test_login_05_usererro>, <test_login.TestLogin testMethod=test_login_06_usererro>, <test_login.TestLogin testMethod=test_login_07_userpassworderror>]>]>, <unittest.suite.TestSuite tests=[]>, <unittest.suite.TestSuite tests=[]>]>
2)方法二(创建一个测试用例加载器loder,加载测试用例创建测试集并对用例进行添加):
from class_16_unittest单元测试集及报告.test import test_login,test_register
loder=unittest.TestLoader()
case_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),'test')
#加载测试用例
suite_login=loder.loadTestsFromModule(test_login)
suite_register=loder.loadTestsFromModule(test_register)
#初始化一个测试集合 suite
suite_total=unittest.TestSuite()
#添加测试用例
suite_total.addTest(suite_login)
suite_total.addTest(test_register)
4.运行流程
1)执行方法一,没有测试报告(使用的是测试用例收集方法二进行的执行):
runner = unittest.TextTestRunner()
runner.run(suite_total)
运行结果:
2)执行方法二,有测试报告:
1.自带的测试报告(TextTestRunner)
with open("test_result.txt",'w',encoding='utf-8') as f:
runner = unittest.TextTestRunner(f)
runner.run(suite_total)
运行结果:
2.HTMLTestRunner(测试报告模板)
with open("test_result.html",'wb') as f:
runner = HTMLTestRunner(f,
title='测试title',
description="测试报告的描述",
tester='测试人'
)
runner.run(suite_total)
运行结果:[/code]
三。openpyxl
1.安装与使用范围
安装:pip install openpyxl
范围(2003年后):xlsx
xls格式:需要用xlrd, xlwt
2.使用
导入
import openpyxl
from openpyxl.worksheet.worksheet import Worksheet
#打开文件
workbook=openpyxl.load_workbook('cases.xlsx')
# print(workbook)
#获取表单名
1)#sheet : Worksheet 可以获取到 对应得表单名字
sheet : Worksheet=workbook['Sheet1']
# print(sheet)
2)#方法二,通过表单名或者排列顺序获得操作表单
sheet=workbook['Sheet1']
#根据位置获取操作表单名称
sheet=workbook.worksheets[0]
#获取数据
1)#根据表单行列获取表单对象,row:行 column:列
cell=sheet.cell(row=2,column=3)
print(cell)
#获取表单数据
print(cell.value)
运行结果:
excel表信息:
2)#根据最大行列,进行获取数据,使用嵌套循环的方法把表单数据一行一行的化为列表返回
注意:
#获取表单的最大行数
row_max=sheet.max_row
#获取最大列数
cloumn_max=sheet.max_column
#使用嵌套循环的方式,精准的拿到每一个坐标的对象,然后转化为值
row_data=[]
for row in range(1,row_max+1):
cloumn_data=[]
for cloumn in range(1,cloumn_max+1):
#print(sheet.cell(row,cloumn))
cloumn_data.append(sheet.cell(row,cloumn).value)
row_data.append(cloumn_data)
print(row_data)
#运行结果:
3)#根据最大行列,进行获取数据,使用嵌套循环的方法把表单数据一行一行的化为dict返回
#获取第一行表单对象
sheet[1]
#可以与切片一起获取固定行的对象
sheet[1:]
row_data=[]
#获取第一行的所有值
header=[c.value for c in sheet[1]]
for row in range(2,row_max+1):
cloumn_data=[]
for cloumn in range(1,cloumn_max+1):
#print(sheet.cell(row,cloumn))
cloumn_data.append(sheet.cell(row,cloumn).value)
#print(cloumn_data)
#使用zip函数把header与一行一行数据进行 分组并返回 tuple对象,然后使用dict转化为字典
dict_data=dict(zip(header,cloumn_data))
row_data.append(dict_data)
print(row_data)
运行结果:
来源:https://www.cnblogs.com/newsss/p/12952480.html
猜你喜欢
- 引用类型(Reference)在许多计算机语言中都被使用,而且是作为一个非常强大而实用的特性存在。它有类似指针(Pointer)的实现,却又
- 前言ES5中新增的不少东西,了解之对我们写JavaScript会有不少帮助,下面主要介绍了ES5中的Array对象,需要的朋友们一起来看看吧
- 在学习了一点 Python 基础之后,我们可以做一个罚点球的小游戏,大概流程是这样:每一轮,你先输入一个方向射门,然后电脑随机判断一个方向扑
- python web.py启动https端口 web.py启动https端口需要ssl
- 本文实例为大家分享了python实现求纯色彩图像的边框,供大家参考,具体内容如下先上效果图,这里显示有点色差, 实际数值是纯色的, 而不是混
- 有时候,我们需要将TensorFlow的模型导出为单个文件(同时包含模型架构定义与权重),方便在其他地方使用(如在c++中部署网络)。利用t
- 在SQL Server数据库中如何查看一个登录名(login)的具体权限呢,如果使用SSMS的UI界面查看登录名的具体权限的话,用户数据库非
- session_unset() 释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的sessio
- 我认为多选列表具有完美的功能——只需按下Ctrl键,同时点击鼠标从列表中选择多个项目。以下是一个典型的多选列表框: 上面那个列表框
- 一、查看可用字体import pygameprint(pygame.font.get_fonts())二、设置字体1.使用系统字体self.
- 本文实例讲述了Python实现简单的列表冒泡排序和反转列表操作。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-
- if条件分支1. if语句基本用法if boolean_value:子代码模块11)判断条件 boolean_value是if语句判断条件
- 当类间继承关系很简单时,super()的使用很简单。class A(object): def __init__(self): p
- 高效处理数据类型方法:处理数据In [1]: from random import randintIn [2]: data=[randint
- 1 引言Pandas是作为Python数据分析著名的工具包,提供了多种数据选取的方法,方便实用。本文主要介绍Pandas的几种数据选取的方法
- 1. 安装vim:# apt-get install -y vim-gnome2. 安装ctags,ctags用于支持tagli
- 一、requestsrequest的说法网上有很多,简单来说就是就是python里的很强大的类库,可以帮助你发很多的网络请求,比如get,p
- defer用于资源的释放,会在函数返回之前进行调用。如果有多个defer表达式,调用顺序类似于栈,越后面的defer表达式越先被调用。def
- 本文实例讲述了Python实现求最大公约数及判断素数的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/env pytho
- 本文实例讲述了Centos7.4环境安装lamp-php7.0的方法。分享给大家供大家参考,具体如下:一. 环境准备桥接模式能访问外网#pi