一。初识单元测试
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)
运行结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]