这些是之前的文章,里面有一些基础的知识点在前面由于前面已经有写过,所以这一篇就不再详细对之前的内容进行描述
Python自动化测试实战篇(1)读取xlsx中账户密码,unittest框架实现通过requests接口post登录网站请求,JSON判断登录是否成功
Python自动化测试实战篇(2)unittest实现批量接口测试,并用HTMLTestRunner输出测试报告
Python自动化测试实战篇(3)优化unittest批量自动化接口测试代码,ddt驱动+yaml实现用例调用,输出HTMLTestRunner测试报告
代码已上传有需求可以自行下载
Python自动化测试实战篇(4)代码
我目前的需求就是针对这个登录接口进行模拟用户批量进行登录测试,登陆完后再点击登录查看登录之后服务器返回的结果,尝试用各种方式去登陆然后查看服务器是否能够返回我们期望的值和数据。
- userAccount: 'admin'
loginPwd: '123456'
- userAccount: 'admin'
loginPwd: '123Aa'
- userAccount: 'admin1'
loginPwd: ''
- userAccount: ''
loginPwd: ''
- userAccount: ''
loginPwd: '123456'
from selenium import webdriver
from selenium.webdriver.common.by import By
import os # 导入路径拼接
import requests
import time
import unittest
import yaml # 导入yaml模块获取yaml文件值
from ddt import ddt, data, unpack # 导入数据驱动
from HTMLTestRunner3_New import HTMLTestRunner
导入本地的lojump.yaml文件,要使用utf-8格式不然会出现乱码
f = open(os.path.join(‘D:\pythonpj\pytest\lojump.yaml’), ‘r’, encoding=‘utf-8’)
加载yaml文件这里一定要使用safe_load不然会报错
ts_et = yaml.safe_load(f)
设置一个url我这里使用的是cms环境你可以自行查找,这里我直接使用requests的Post方法来进行请求
url = ‘http://192.168.52.129:8080/cms/manage/loginJump.do’
设置一个url请求头
headers = {‘Content-Type’: ‘application/x-www-form-urlencoded’}
设置交互点击地址的url
drurl = ‘http://192.168.52.129:8080/cms/manage/login.do’
这里需要了解的是,首先定位不能够错误,如果定位错误那么后续的结果就是找不到,我这边模拟键盘输入的内容就是直接从yaml里面获取的,yaml头命名一定要跟你在dict[‘’]中请求的名称一样不然的话也是无法输入成功
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
driver = webdriver.Chrome(chrome_options=option)
driver.get(drurl)
time.sleep(2)
driver.find_element(By.XPATH, '//*[@id="userAccount"]').send_keys(dict['userAccount'])
driver.find_element(By.XPATH, '//*[@id="loginPwd"]').send_keys(dict['loginPwd'])
driver.find_element(By.XPATH, '//*[@id="loginBtn"]').click()
reps = requests.post(url=url, headers=headers,
data={'userAccount': dict['userAccount'],
'loginPwd': dict['loginPwd']})
这个断言个规则根据服务器返回的值来进行捕获,有什么返回值就捕获什么返回值即可。
js = reps.json()
if js['msg'] == '登录成功!': # 设定断言
assert js['msg'] == '登录成功!' # 捕获断言
print('恭喜你接口登录成功')
elif js['msg'] == '登录密码不正确!':
assert js['msg'] == '登录密码不正确!'
print('密码不正确')
elif js['msg'] == '登录密码不能为空!':
assert js['msg'] == '登录密码不能为空!'
print('密码不能为空')
elif js['msg'] == '登录帐号不能为空!':
assert js['msg'] == '登录帐号不能为空!'
print('账户不能为空')
else:
print('接口登录不成功')
@ddt
class lg(unittest.TestCase):#定义一个类继承单元
@data(*ts_et)
@unpack
def test_logjump(self, **dict): # 定义一个测试用例
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
driver = webdriver.Chrome(chrome_options=option)
driver.get(drurl)
time.sleep(2)
driver.find_element(By.XPATH, '//*[@id="userAccount"]').send_keys(dict['userAccount'])
driver.find_element(By.XPATH, '//*[@id="loginPwd"]').send_keys(dict['loginPwd'])
driver.find_element(By.XPATH, '//*[@id="loginBtn"]').click()
reps = requests.post(url=url, headers=headers,
data={'userAccount': dict['userAccount'],
'loginPwd': dict['loginPwd']})
time.sleep(2)
js = reps.json()
if js['msg'] == '登录成功!': # 设定断言
assert js['msg'] == '登录成功!' # 捕获断言
print('恭喜你接口登录成功')
elif js['msg'] == '登录密码不正确!':
assert js['msg'] == '登录密码不正确!'
print('密码不正确')
elif js['msg'] == '登录密码不能为空!':
assert js['msg'] == '登录密码不能为空!'
print('密码不能为空')
elif js['msg'] == '登录帐号不能为空!':
assert js['msg'] == '登录帐号不能为空!'
print('账户不能为空')
else:
print('接口登录不成功')
driver.quit()
def logjum():
a1_path = os.path.abspath(os.path.dirname(__file__))
report_path = os.path.join(a1_path, '用例测试报告.html')
discre = unittest.defaultTestLoader.discover(start_dir=a1_path, pattern='g2.py')
p = open(report_path, 'wb')
run = HTMLTestRunner(stream=p, title='登录接口用例测试报告', description='执行情况', tester='you')
run.run(discre)
这里需要注意的是unittest.main()中一定要加入for循环1次,不然执行完操作之后就会出现无限循环下去的可能性,之前接口测试的时候没有出现这个bug,但是在selenium加进去后就出现了这个bug也不知道是什么问题引发。
if __name__ == '__main__':
logjum()
for i in range(0):
unittest.main()
可以看到执行完成,时间是58秒
登录接口也显示了执行了多条断言成功,并成功显示我们捕获的内容,当然我这里只是根据我的一些用例进行测试,你也可以自己多写几千条进行也没问题。