大家好。我是小蔡:
这是Web自动的第二章。上一张主要介绍selenium框架。这一章我介绍其他框架和工具
今天分享的内容有几个方面:
1.Unitest测试框架
2.Log模块以及底层
3.PO模式
4.数据驱动
5.HTML自动生成报告(GIT引入的一个包,哈哈)
1.Unitest测试框架:
引入Unitest的目的:1)解决一类多用的问题。2)需要断言
核心组件:
TestCase[用例组件]
TestSuite
TestRunner(套件)
TestLoader(套件)
Fixture(工程装置)
TestCase:
操作:
1.导包 import unittest
2.新建类,并继承unittest.TestCase
3.测试方法必须使用Test开头
代码:
import unittest
class Test(unittest.TestCase)
TestRunner(套件)/TestSuite:
多个TestCase组成TeSuite套件
使用:
实例化
suite = unittest.TestSuite
添加用例:#添加
suite.addTest(Test01("test_add"))
执行套件:
实例化
runner = unittest_textTestRunner
添加/执行套件
runner.run(suite)
扩展添加:
搜索指定classname 内中以test开头方法并执行套件
my_name_si_shili=unittest.Testsuite()
my_name_si_shili.addtest(unittest.makesuite(Test02))
.....
TestLoader方法类:
解决批量导入的问题:将Testcase添加入套件,满足条件就添加
my_name_si_shili=unittest.TestLoader().discover(测试目录.查找py文件格式)
不使用实例化
unittest.defaultTestLoader.discover(../cases)
区别(TestLoader与TestSuite)
两者都是套件,前置是按指定目录,指定py文件。后者是按类和方法
Fixture装置(前置通知/后置通知)
#初始化函数 def setup()
#结束函数 def setdown()
级别:函数/类/模块
类
@classmethon 对类级别进行修饰
def set/downclass()
模块
def set/downmodule()
断言UnitTest
常用断言:
asserture()
asserfalse()
assertEqual(参数1,参数2)
assernotEqual(参数1,参数2)
assertIn("XXX","XXX") #后面串包含前面的串
扩展:
python自带断言机制
assert str1=str2
assert str1 in str2 "错误信息"
assert Ture/false
Unittest跳过
对一些为满足的测试用例进行跳过
Unittest.Skip(‘代码未完成’)
#可用于修饰测试函数跳过
满足特定条件提过
Unittest.SkipIf(跳过条件,原因)
2.生成HTML测试报告
因为Unittest没有自带HTML版的报告
操作
复制HTMLTestRunner.py文件到指定目录(git下载)
导包操作 import HTMLTestRunner
直接打开文件,并调用run方法
实战操作:
扩展:
open与with open 区别
相同点:均是打开文件
异同点:with open 等于打开关闭文件
一般打开文件都怎么写:
try:
f=open("../目录”,“r”,enconding="utf-8")
print(f.read())
except:
pass
finally:
f.close()
3.PO模式:
PO模式主要思想
1.不采用任何方法
2.采用测试框架
3.将业务代码和页面对象进行(分离)
4.实际编写 Po编写
所以我们Web自动化架构分成:三层即page类,case类,base类
page:一个页面一个对象
case:集成base类+调用page页面
base:抽取公共的方法
4.数据驱动
前置知识:
Unittest框架时没有参数化插件的。需要建筑parameterized插件实现参数化
parameterized使用步骤:
导入parameterized框架包
需要在参数化的测试函数上@parameterized.expand(列表)
列表的值:单(列表)多(值为列表嵌套元组)【(1,2,3),(1,2,3,)】
用法:
class def_01(unittest.TestClass):
#单个参数使用法:
@parameterized.expand(["1,2,3"]):
def test_add_one(sefl,num):
pringt(num)
思想:
将数据放置到文件中,实现数据驱动
是一种设计思想
数据驱动技术是以讲关注点放到测试数据的构建上,可以将不同数据,执行相同用例上
依赖于我们的前置参数化
传入方式/载体:
直接定义在脚本中
从文件中读取:json,excel,xml,txt
从数据库中获取
直接从接口获取数据
本地封装
总结:
数据驱动=数据存储+读取数据工具(自己写的)+参数化技术
Json:
问题:
需要数据格式【(),()】,【(),()】
解决:
新建列表
读取值,转化json
arrys=[]
for date in read_json(“login_json").values():
arrys.append((date.get("username"))
json基本情况介绍
1.基于文本轻量级交换
2.具有良好的结构
【key,value】
xml格式:
<?xml version=8 encoding=utf-8"?>
<person>
....
</person>
扩展:
json与字典之间转化:
转化代码:
python--->json
import json
date= {"name":“名字”,“年龄”:“18” }
date=json.dumps(date)
json-->python
import json
json= {"name":“名字”,“年龄”:“18” }
date2=json.loads(json)
读取json:
with open ('文件名',‘r’,enconding='utf-8') as f :
date=json.load(f)
写入json:
json_01={'name':'tom','age':‘18’}
with open('data.json','w',encoding='utf-8') as f:
json.dump(json_01,f,ensure_ascill=False)
编写数据数据读取工具类:(动态获取)
def read_json(filename):
filename="../date/"+filename
#调用读取方法
with open(filename,"r",enconding=utf-8) as f :
return json.load(f)
5.日记模块:
作用
运行调试错误
便于观察
级别
Debug调试级别
Info信息级别
WARINO警告
Error出现不能用
Crttal严重错误
如何使用
Logging模块
logging{级别}
#如何设置日记级别:
logging,basicConfig(level=looging.DEBUG)
#如何设置日志格式:
f=指定格式
logging.basicConfig(level=looging.DEBUG,format=f,filename"路径格式")
基本用法:
def get_logging():
f=指定格式
logging.basicConfig(level=looging.DEBUG,format=f,filename"路径格式")
return logging
#在每个需要操作的步骤上方或者下方标注即可
标注方式:logging.info
高级用法:涉及logging类的底层,这个部分可看也可以不看
日记的四大组件
日记类:Logger 提供入口
处理类:Handler 将logging日记发送到合适的目的输出
格式器:Forratter 决定日志的输出格式
过滤器:Fitter 提供了更细的粒度控制日志记录
组件关系
logger 需要多个Hanlder 将日志输出到A,B
Hanlder需要设置 formatter 将日志输出到AB
formatter设置,实现过滤
获取Looger对象:
logger =logger.getLogger()
logger=logger.getLoggger("指定名称”)
Logger常用对象:
Logger.五个等级()
Logger.setLevel()//设置日志将会处理等级
Logger.addHandler()//为该logger对象添加handler
Looger.addFilter()//为该logger对象添加一个filter对象
Handler类
#将消息分配到指定位置
Logger对象可以通过addhandler()方法为自己添加对象
#如何创建handler对象
基本不实例化和handeler实例
handler是个基类
#logering内置handler包括:
获取控制器(处理类)
sh.logging.StreamHandle()
logger.addHandler(sh)
#时间处理器和格式处理器:
#添加格式器
#以及设置处理器级别
最后。。。给大家看看成品吧 我实在是不想分步骤了
最后呢运用了一个单例的设计模式。。去设计这个日记类。。就是预防多次调用,出现了多个logger()方法
总结:
web自动化基本上已经总结完了。后续会推出App自动化的学习笔记。也感谢各位关注。
至于提到的Web项目的实战。会找一个三端的东西结合运用吧 App/Web/后台 三者的结合的系统(目前正在开发ing~)