Unittest-单元测试3

续接上一次笔记  ​​​​​​​ Unittest-单元测试2

十一、忽略测试用例

@unittest.skip(“理由”) 直接忽略,给出理由

@unittest.skipIf(判断,”理由”) 符合判断忽略,给出理由

@unittest.skipUnless(判断,”理由”) 不符合判断忽略,给出理由

# 测试用例
@unittest.skip("测试忽略011")
def test01_cs01(self):
    print("测试011")
a = 10
@unittest.skipIf(a>2 and a<20,"在2到20之间忽略测试022")
def test01_cs02(self):
    print("测试022")

@unittest.skipUnless(a < 2 , "a小于2忽略测试033")
def test01_cs03(self):
    print("测试033")

十二、unittest单元框架中的断言

assertEqual(a,b) 断言a==b

assertNotEqual(a,b) 断言a!=b

assertTrue(a) 断言a为真

assertFalse(a) 断言a为假

assertIn(a,b) 断言a在b里面

assertNotIn(a,b) 断言a不在b里面

十三、批量执行用例生成HTML格式的报告

HTMLTestRunner.py     放入python文件夹下的lib文件夹下

import os
import sys
import time
import unittest
from HTMLTestRunner import HTMLTestRunner

if __name__ == '__main__':
    # 第一种
    # unittest.main()
    # 通过测试套件
    suite = unittest.TestSuite()
# 执行所有当前目录下的用例
    testcases = unittest.defaultTestLoader.discover(os.getcwd(), '*.py')
    suite.addTests(testcases)
    # unittest.TextTestRunner(verbosity=2).run(suite)
    nowtime = time.strftime("%Y-%m-%d %H-%M-%S",time.localtime())
    name = open(os.getcwd()+"/"+nowtime+"report.html","wb")
    runner = HTMLTestRunner(stream=name,verbosity=2,
                   title="unittest自动化测试报告",description="报告详情如下:")
    runner.run(suite)

保存当前报告到当前目录下生成report.html文件

name = open(os.getcwd()+"/"+nowtime+"report.html","wb")

设置生成报告的标题,保存路径,展示情况等

runner = HTMLTestRunner(stream=name,verbosity=2,
               title="unittest自动化测试报告",description="报告详情如下:")

运行生成报告

runner.run(suite)

十四、DDT数据驱动

unittest,ddt

1.为什么需要数据驱动?

数据文件中有11组数据,代码只有一份。代码数据分离,解耦合。

2.驱动模式介绍

数据驱动

关键字驱动(核心:把业务逻辑封装成关键字login,只需要调用login。)

混合驱动模式(关键字驱动+数据驱动):市场主流

行为驱动测试:Lettuce

3.什么是DDT

data driver test 数据驱动测试。特点:可以完美和应用于Unittest框架实现数据驱动。

4.DDT详解

ddt是通过装饰器的形式来调用的。

装饰器:完成一种特定功能的函数(事物)。

在python里面装饰器是以@开头,并且装饰器有两种:类装饰器,函数装饰器。

ddt里面有哪些装饰器:

@ddt(类装饰器,申明当前类使用ddt框架)

@data(函数装饰器,用于给测试用例传递数据)

@unpack(将传输的数据包解包),一般作用与元祖tuple和列表list

@file_data(函数装饰器,可直接读取yaml/json文件)

5.实战@ddt,@data

总结:当传单个值时,所有的类型都可以传,并且用例执行一次。

如果说:@data传入多个值的时候,那么传几个值,那么用例执行几次

6.实战@unpack

如果是数字或者字符串:那么不需要@unpack

如果是元祖和列表的话,那么可以通过@unpack,但是参数的个数必须和解完包后的值的个数一样

如果是集合无法解包

如果是字典,那么可以通过@unpack解包,但是参数的名字和个数必须和字典的键保持一直。

@ddt
class Test(unittest.TestCase):

    # python数据类型:数字(int,long,float,complex),字符串,列表list,元祖tuple,集合set,字典dict

    @data(("王者","荣耀"),("10","20"))
    @unpack
    def test01_ceshi(self,args1,args2):
        print(args1,args2)

    @data(["王者","荣耀"],["10","20"])
    @unpack
    def test02_ceshi(self,args1,args2):
        print(args1,args2)

    @data({"name":"王者","age":"18"},{"name":"荣耀","age":"18"})
    @unpack
    def test03_ceshi(self,name,age):
        print(name,age)


if __name__ == '__main__':
    unittest.main()

7.DDT项目实战

Python的环境

两种环境:

1.本地(只有一个)

2.虚拟(有N个,每一个项目都有一个虚拟环境)

import os
import time
import unittest
from HTMLTestRunner import HTMLTestRunner

import openpyxl
from ddt import ddt, data, unpack
from selenium import webdriver

# 读取excel
# xlrd,xlwt,openpyxl
def read_excel():
    workbook = openpyxl.load_workbook("data1.xlsx")
    sheet = workbook["login"]
    # print(sheet.max_row, sheet.max_column)
    alllist = []
    for row in range(2, sheet.max_row + 1):
        templist = []
        for col in range(1, sheet.max_column + 1):
            templist.append(sheet.cell(row, col).value)
        alllist.append(templist)
    number = len(alllist)
    return alllist


@ddt
class Test(unittest.TestCase):
    @data(*read_excel())
    @unpack
    def test_jenkins_login(self, order, username, password):
        driver = webdriver.Chrome()
        driver.get("http://192.168.2.25/#/login?redirect=%2Findex")
        driver.find_element_by_xpath('//*[@id="app"]/div/form/div[1]/div/div/input').clear()
        driver.find_element_by_xpath('//*[@id="app"]/div/form/div[1]/div/div/input').send_keys(username)
        driver.find_element_by_xpath('//*[@id="app"]/div/form/div[2]/div/div[1]/input').clear()
        driver.find_element_by_xpath('//*[@id="app"]/div/form/div[2]/div/div[1]/input').send_keys(password)
        driver.find_element_by_xpath('//*[@id="app"]/div/form/div[3]/div/button').click()
        time.sleep(3)
        # 断言
        self.assertIn("#/index", driver.current_url, msg="用户不存在/密码错误")


if __name__ == '__main__':
    testcases = unittest.defaultTestLoader.discover(os.getcwd(), '*.py')
    nowtime = time.strftime("%Y-%m-%d %H-%M-%S", time.localtime())
    filename = open(os.getcwd() + "/" + nowtime + "report.html", "wb")
    runner = HTMLTestRunner(stream=filename, verbosity=2,
                            title="登录自动化测试报告", description="报告详情")
    runner.run(testcases)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值