一天一个关于测试知识点,5分钟内讲解你最关心的软件测试问题,今天就接着来谈谈关于自动化测试中的“Pytest框架来实现requests类的测试”。
以上的测试用例都是基于unittest来实现的,根据“Python单元测试框架Pytest”所讲的内容,很容易把它变成基于Pytest框架来实现。代码如下。
案例4-95:基于Pytest的电子商务网站自动化测试实现。
#使用excel作为驱动,进一步优化
import requests
import Pytest
from Util import util
import allure
class TestEbusiness:
def setup_class(self):
self.myutil=util()
self.url_product="http://localhost:8000/login_action/"
self.url_craete_order="http://localhost:8000/create_order/"
self.url_deleted_order="http://localhost:8000/delete_orders/"
self.token = "RNF3Y04qFeJkMwCDsTMn4gfMcyfQ2vUjXbcENLADEFyCSRp1pBdezZKwHhlSwqgE"
self.cookie = {"csrftoken":self.token}
#登录之前,确保数据库中没有这条数据
@allure.feature('电子商务产品')
@allure.story('用户模块')
@allure.severity('Normal')
@allure.issue("http://www.jila.com")
@allure.testcase("http://www.testlink.com")
def test_correctusername_discorrectpassword(self):
"""
用例描述:正确的用户名,错误的密码
"""
info = self.myutil.check_condition_for_user(0)
if not info=="":
payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}
data = requests.post(self.url_product,data=payload,cookies=self.cookie)
#验证返回码
self.myutil.AssertEqual("200",str(data.status_code))
#验证返回内容
self.myutil.AssertIn("用户名或者密码错误",str(data.text))
@allure.feature('电子商务产品')
@allure.story('用户模块')
@allure.severity('Normal')
@allure.issue("http://www.jila.com")
@allure.testcase("http://www.testlink.com")
def test_discorrectusername_correctpassword(self):
"""
用例描述:错误的用户名,正确的密码
"""
info = self.myutil.check_condition_for_user(1)
if not info=="":
payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}
data = requests.post(self.url_product,data=payload,cookies=self.cookie)
#验证返回码
self.myutil.AssertEqual("200",str(data.status_code))
#验证返回内容
self.myutil.AssertIn("用户名或者密码错误" ,str(data.text))
@allure.feature('电子商务产品')
@allure.story('用户模块')
@allure.severity('Critical')
@allure.issue("http://www.jila.com")
@allure.testcase("http://www.testlink.com")
def test_discorrectusername_discorrectpassword(self):
"""
用例描述:错误的用户名,错误的密码
"""
info = self.myutil.check_condition_for_user(2)
if not info=="":
payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}
data = requests.post(self.url_product,data=payload,cookies=self.cookie)
#验证返回码
self.myutil.AssertEqual("200",str(data.status_code))
#验证返回内容
self.myutil.AssertIn("用户名或者密码错误",str(data.text))
@allure.feature('电子商务产品')
@allure.story('用户模块')
@allure.severity('blocker')
@allure.issue("http://www.jila.com")
@allure.testcase("http://www.testlink.com")
def test_correctusername_correctpassword(self):
"""
用例描述: 正确的用户名,正确的密码
"""
info = self.myutil.check_condition_for_user(3)
if not info=="":
payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}
data = requests.post(self.url_product,data=payload,cookies=self.cookie)
#验证返回码
self.myutil.AssertEqual("200",str(data.status_code))
#验证返回内容
self.myutil.AssertIn("电子商务系统" ,str(data.text))
@allure.feature('电子商务产品')
@allure.story('订单模块')
@allure.severity('blocker')
@allure.issue("http://www.jila.com")
@allure.testcase("http://www.testlink.com")
def test_create_order(self):
"""
用例描述:检查创建订单
"""
#初始化订单测试数据
info = self.myutil.check_condition_for_order()
mysession = requests.Session()#关联session对象建立
payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}#用户登录参数
data = mysession.post(self.url_product,data=payload,cookies=self.cookie)#模拟用户登录
payload={"address":info["address_id"],"csrfmiddlewaretoken":self.token}#创建订单参数
self.cookie.update({"1":"1","2":"2","3":"3"})#创建产品id,分别为id=1、id=2、id=3号
data = mysession.post(self.url_craete_order,data=payload,cookies=self.cookie)#创建订单
#验证返回码
self.myutil.AssertEqual("200",str(data.status_code))
#验证返回内容
self.myutil.AssertIn("生成时间",str(data.text))
#验证完毕删除订单
self.myutil.delete_order(info["user_id"])
@allure.feature('电子商务产品')
@allure.story('订单模块')
@allure.severity('blocker')
@allure.issue("http://www.jila.com")
@allure.testcase("http://www.testlink.com")
def test_delete_order(self):
"""
用例描述:检查删除订单
"""
#初始化订单测试数据
info = self.myutil.check_condition_for_order()
#建立订单
orders_id = self.myutil.create_order(info["address_id"],info["user_id"])
mysession = requests.Session()#关联session对象建立
payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}#用户登录参数
data = mysession.post(self.url_product,data=payload,cookies=self.cookie)#模拟用户登录
payload={"address":info["address_id"],"csrfmiddlewaretoken":self.token}#创建订单参数
self.cookie.update({"1":"1","2":"2","3":"3"})#创建产品id,分别为id=1、id=2、id=3号
data = mysession.post(self.url_deleted_order+str(orders_id)+"/3/",data=payload,cookies=self.cookie)#创建订单
#验证返回码
self.myutil.AssertEqual("200",str(data.status_code))
#验证返回内容
self.myutil.AssertNotIn("删除",str(data.text))
if __name__ == '__main__':
Pytest.main(['-sv','-q','--alluredir','./report/xml'])
运行结果如下。
…
-- Docs: https://docs.Pytest.org/en/latest/warnings.html
[33m[1m==================== 6 passed,5 warnings in 6.97 seconds =====================[0m
采用了Pytest框架,配合Pytest-xdist的组件,测试用例可以并发运行。Pytest-xdist安装方法如下。
C:\Users\xiang>pip3 install Pytest-xdist
把上面的测试用例拆分为六个文件,每个文件仅包含一个测试用例,比如test_create_order()可以作为以下测试用例。
import requests
import Pytest
from Util import util
class TestEbusiness:
def setup_class(self):
self.myutil=util()
self.url_product="http://localhost:8000/login_action/"
self.url_craete_order="http://localhost:8000/create_order/"
self.url_deleted_order="http://localhost:8000/delete_orders/"
self.token = "RNF3Y04qFeJkMwCDsTMn4gfMcyfQ2vUjXbcENLADEFyCSRp1pBdezZKwHhlSwqgE"
self.cookie = {"csrftoken":self.token}
def test_create_order(self):
"""
用例描述:检查创建订单
"""
#初始化订单测试数据
info = self.myutil.check_condition_for_order()
mysession = requests.Session()#关联session对象建立
payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}#用户登录参数
data = mysession.post(self.url_product,data=payload,cookies=self.cookie)#模拟用户登录
payload={"address":info["address_id"],"csrfmiddlewaretoken":self.token}#创建订单参数
self.cookie.update({"1":"1","2":"2","3":"3"})#创建产品id,分别为id=1、id=2、id=3号
data = mysession.post(self.url_craete_order,data=payload,cookies=self.cookie)#创建订单
#验证返回码
self.myutil.AssertEqual("200",str(data.status_code))
#验证返回内容
self.myutil.AssertIn("生成时间",str(data.text))
#验证完毕删除订单
self.myutil.delete_order(info["user_id"])
if __name__ == '__main__':
Pytest.main(['-sv','-q','--alluredir','./report/xml'])
通过如下命令,可以在同一时刻运行3个测试用例。
C:\Users\xiang\Desktop\code\for_teacher\requests\Pytest\concurrency>pytest -n 3
运行结果如下。
=================================================================================== test session starts ====================================================================================
platform win32 -- Python 3.7.1,Pytest-4.5.0,py-1.7.0,pluggy-0.4.0
rootdir: C:\Users\Jerry\Desktop\code\for_teacher\requests\Pytest\concurrency
plugins: xdist-1.28.0,parallel-0.0.9,forked-1.0.2,allure-Pytest-2.6.3
gw0 [6] / gw1 [6] / gw2 [6]
...... [100%]
================================================================================= 6 passed in 3.92 seconds =================================================================================
比较一下,在非并发情况下6个测试用例运行共耗时6.97秒,在并发情况下仅用例3.92秒。