html数据驱动,yaml模块管理用例,单元测试unittest+数据驱动(yml),html报告

1.yaml 可以用来做数据驱动,比较灵活

import yaml #用来读配置文件的比如file文件 文件以yaml和yml结尾 这种格式写用例比较容易处理,字典方便取值 取不到就没有不报错,主要是灵活。

f = open('login.yaml',encoding='utf-8')

res = yaml.load(f) #加载读出文件 将键值对转化为字典

print(res)

比如:login.yml

- #是list的写法 可以防止字典相同的key覆盖

url : /api/user/login

method : post

detail : 正常登录

data :

username : niuhanyang

passwd : aA123456

check :

- userId

- sign

-

url : /api/user/login

method : post

detail : 密码错误

data :

username : niuhanyang

passwd : aA12333

check :

- 密码错误

-

url : /api/user/login

method : post

detail : 不传密码

data :

username : niuhanyang

check :

- 必填参数未填

2.单元测试

import unittest #单元测试模块

import HTMLTestRunner #用来生成报告用

from BeautifulReport import BeautifulReport as bf #好看的测试报告 bf是别名方便使用

class TestCalc(unittest.TestCase): #继承 变为测试用例

def setUp(self):

print('setup是啥时候运行的')

#每个用例运行之前运行的 可以作为后续的前提条件

def tearDown(self):

print('teardown是啥时候运行')

#每个用例运行之后运行的 可以在收尾做比如删除数据的操作。

@classmethod #定义类方法

def setUpClass(cls): #直接继承父类方法

#在所有用例执行之前运行的

print('什么时候运行的setupclss')

@classmethod

def tearDownClass(cls):

#在所有用例都执行完之后运行的

print('什么时候运行的teardownclass')

def testliuwei(self): #用例执行顺序是按照首字母的顺序(在报告中可看出)

'''刘伟测试''' #通过‘’‘来加入用例描述 报告中就会加入用例描述

print('刘伟')

self.assertEqual(1,1) #该子类没有 继承父类比较两个值 后面也可以再加参数作为提示信息。

def testzch(self): #以test开头就可以运行用例 否则不会自动运行

'''赵传慧测试'''

print('赵传慧')

self.assertEqual(1,2)

def testa(self):

print('testa')

self.assertEqual(1,1)

def testc(self):

print('testc')

self.assertEqual(1,2)

# unittest.main() #会运行当前python文件里面的所有测试用例 **运行时注意run 产生报告时不用该模式

将用例产生报告主要有以下几个步骤

# 1、先把所有的测试用例都放到用例集。用例集也做测试套件是用来存放测试用例的

#2、运行这些测试用例

#3、产生报告

suite = unittest.TestSuite() #测试集合 存放用例 其实是一个list

suite.addTest( unittest.makeSuite(TestCalc) ) #把刚才写的用例加进来 **写入类名

bf报告生成

run = bf(suite) #实例化一下,他是一个类必须实例化使用

run.report(description='描述必须写',filename='test') #还可指定log位置等

HtmlTESTRunner如何产生报告

# f = open('test.html','wb') #以2进制模式 不考虑编码集的问题

# runner = HTMLTestRunner.HTMLTestRunner(f,title='双鱼座用例标题',description='这是用例描述') #后面两个参数是非必须的

# runner.run(suite) #运行用例

3.利用yaml做数据驱动来做测试接口

import unittest,requests

import ddt  #   #可做参数化  自动读文件中数据

from BeautifulReport import BeautifulReport as bf

from urllib import parse

@ddt.ddt  #申明这个类要别ddt使用啦

class Login(unittest.TestCase):

base_url = 'http://118.24.3.40/'   #为给url统一加前缀   可写入配置文件比较好

@ddt.file_data('login.yaml')#ddt帮你读文件,获取文件内容,循环调用函数,并且传给下面函数的如kwargs中,有多少条数据循环调用多少次下面的函数  注意修改文件open源码加入utf8编码打开不报错

def test_request(self,**kwargs):

detail = kwargs.get('detail','没写用例描述')  # '''和%s组合来描述用例在这里无效。

self._testMethodDoc = detail  #动态的用例描述

url = kwargs.get('url')#url

url = parse.urljoin(self.base_url,url)#拼接好url  只能拼接 比如关于/的问题处理

method = kwargs.get('method','get')#请求方式给他一个默认值get  防止没有传请求方式

data = kwargs.get('data',{}) #请求参数

header = kwargs.get('header',{})#请求头

cookie = kwargs.get('cookie',{})#cookie

check = kwargs.get('check')

method = method.lower() #便于处理

try:

if method=='get':

res = requests.get(url,params=data,cookies=cookie,headers=header).text

#因为接口有异常的情况下, 可能返回的不是json串,会报错

else:

res = requests.post(url,data=data,cookies=cookie,headers=header).text

except Exception as e:

print('接口请求出错')

res = e

for c in check:

self.assertIn(c,res,msg='预计结果不符,预期结果【%s】,实际结果【%s】'%(c,res))    #查看是否包含 断言查看一次错误就停止,后面加如错误提示  但check在yml中得是list方便查看是否包含。

sutie = unittest.TestSuite()

sutie.addTest(unittest.makeSuite(Login))#添加用例

run = bf(sutie)  #实例化

run.report('login_test','登录测试用例')

print(run.success_count) #通过的次数

print(run.failure_count)  #失败的次数

思考?

# 1、运行的用例条数是不是和你的用例数一样

# 2、看看有没有其他不对的地方

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值