关于测试的那些事03

目录

一、unittest 框架

二、测试套件

三、测试用例(方法)执行顺序

四、忽略一个测试用例的执行

五、unittest断言

六、html报告

七、异常捕捉,错误截图

八、数据驱动


一、unittest 框架

(1)测试固件

setup 方法:测试环境和数据的准备工作

tearDown方法:做测试用例执行完之后的清理工作

(2)测试用例

一个用例是一个方法,方法格式:def test_名字

(3)测试套件

把测试用例组织到一起进行一个整体测试

编写代码:

首先导入包 import unittest,整个类必须继承unittest.TestCase

from selenium import webdriver
import unittest
import time
class Baidu(unittest.TestCase):
    #测试固件
    def setup(self):#self是python定义全局变量的方式
        print("-----setup---")
        self.driver = webdriver.Chrome()
        self.url = "http://www.baidu.com/"
        self.driver.maximize_window()
        time.sleep(3)
    def tearDown(self):
        print("-----tearDown--")
        self.quit()
    def test_hbaidu(self):
        #编写测试用例
        driver = self.driver
        url = self.url
        driver.get(url) #这句很关键,没有这句不会打开百度网页
        ....
if __name__ == '__main__':
        unittest.main()

二、测试套件

四种情况:

unittest.TestSuite()

import unittest
def creatSuit():
    suit=unittest.TestSuite()
    #a.一个一个方法的添加:addTest(脚本名称.类名("方法名"))
    suit.addTest(testbaidu1.Baidu1("test_hao"))
    suit.addTest(testbaidu2.Baidu2("test_hao"))
    
    #b.把一个类的所有方法都添加到测试套件中:unittest.makeSuit(脚本名.类名)
    suit.addTest(unittest.makeSuit(testBaidu1.Baidu1))
    
    #c.把一个类中的所有测试方法创建成一个套件返回,与上一个方法一样,也是一个类一个套件,两个类单独形成各自的套件,再合并:TestLoader
    suit1 = unittest.TestLoader().LoadTestsFromTestCase(testBaidu1.Baidu1)#单独的套件1
     suit2 = unittest.TestLoader().LoadTestsFromTestCase(testBaidu2.Baidu2)#单独的套件2
    suit=unittest.TestSuite([suit1, suit2])#把两个套件合并
    
    #d.把一个文件夹下所有的测试脚本(所有类)的测试用例都执行一遍:discover("文件夹名","要运行的测试用例所在文件名",top_level_dir=None)
    unittest.defaultTestLoader.discover("../src20211230", pattern="testbaidu*.py", top_level_dir=None)
​
    return suit
​
if __name__ = '__main__':
    suit=creatSuit()
    #verbosity=0,1,2是返回运行测试套件后打印的信息的精细程度,2是最详细的
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suit)

三、测试用例(方法)执行顺序

test_名字,按照方法名依次比较数字、字母先后顺序:0-9>A-Z>a-z

四、忽略一个测试用例的执行

在这个测试用例前打上标签,添加一句:

@unittest.skip("skipping")

五、unittest断言

判断实际结果和预期结果是否相符合

#预判是相等的
self.assertEqual(arg1,arg2.msg="如果预判错误输出的信息,该信息会输出到控制台")
#预判是不相等的
self.assertNotEqual(arg1,arg2.msg="如果预判错误输出的信息")
self.assertTrue(arg1,msg="...")
self.assertFalse(arg1,msg="...")

六、html报告

对于一个测试套件,会有上百个测试用例,html报告可以集中清晰的查看测试用例的结果

生成html报告步骤:

(1)先创建一个存放html报告的文件夹

#在测试套件中先导入包
import sys
import os
import HTMLTestRunner
#在main中
if _name_ = "_main_":
    #创建文件夹
    #当前路径,也可以用.表示
    curpath = sys.path[0]  #sys.path[0]是一个路径集合数组
    #如果当前路径下不存在resultreport文件夹就创建一个
    if not os.path.exists(curpath+'/resultreport'):
        os.makedirs(curpath+'/resultreport')

(2)解决重复命名问题(用当前的时间命名)

now = time.strftime("%Y-%M-%d-%H %M %S",time.localtime(time,time())) #获取当前的时间
filename = curpath + '/resultreport'+now + '/resultreport.html'

(3)报告输出

with open(filename, 'wb') as fp:  #打开HTML文件,以写的方式
    runner =HTMLTestRunner(stream=fp,title=u"测试报告",description=u"用例执行情况",verbosity=2)  #括号里的参数是html报告里的参数
    suite=createsuite()
    runner.run(suite)

七、异常捕捉,错误截图(保留测试结果现场)

将截图保存在image文件夹下

错误截图的api: get_screenshot_as_file()

#先定位到搜索框,再输入"博君一肖",此时比较title和预期的是否一样
try:
    #产生异常,被捕获到
    self.assertEqual(driver.title,"王一博_百度搜索",msg="实际和预期不一致")
except:
    self.saveScreenAsPhoto(driver,'hao.png')
time.sleep(3)
​
def saveScreenAsPhoto(self,driver,file_name) :
    if not os.path.exists("./image"):
        os.makedirs("./image")
    now = time.strftime("%Y%m%d-%H%M%S",  time.localtime(time.time()))
    driver.get_screenshot_as_file("./image/" + now + "-" + file_name)
    time.sleep(3)

八、数据驱动:用测试数据驱动测试用例代码执行

(1)导入包,并且要在该类上添加标签@ddt

from ddt import ddt,unpack,data,file_data

(2)驱动方式:把以下的语句添加在想要用的测试用例上

#一次传一个参数
@data("...","...")
​
#一次传入多个参数,要加上@unpack映射,与方法中对应的参数绑定
@data(["..",".."],["..",".."])
@unpack
​
#当要传入的数据有很多时,可以将数据写在文件中(文件最前面要加data)
@data(*解析数据的方法('文件名(txt文件)'))
也要有解析数据的方法
def getTxt(file_name):
    rows = []
    path = sys.path[0]
    with open(path+'/data/'+file_name,'rt', encoding='utf8') as f:
        readers = csv.reader(f,delimiter=',',quotechar='|')
        next(readers,None)  #一行一行的从文件中读取
        for row in readers:
            temprows=[]
            for i in row:
                temprows.append(i)
            rows.append(temprows)
            print(rows)
            return rows
​
@file_data("json文件")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值