测试百度
# -*- coding: utf-8 -*-
import requests
import unittest
class Bobo_test(unittest.TestCase):
def setUp(self) -> None:
self.session=requests.Session()
self.url="https://www.baidu.com/"
self.ver="https://www.baidu.com/"
pass
def tearDown(self) -> None:
self.session.close()
pass
def test_001_success(self):
res=self.session.get(url=self.url)
res.encoding="utf-8"
self.assertEqual(200,res.status_code)
print(res.headers.get("Content-Type"))
self.assertIn("text/html",res.headers.get("Content-Type"))
self.assertIn("百度一下,你就知道",res.text)
生成测试报告:加上时间
import time
import unittest
from HTMLTestRunner import HTMLTestRunner
now=time.strftime("%Y%m%d %H%M%S")
suite=unittest.TestLoader().discover(r"D:\PyCharm Community Edition 2021.3.2\jbr\bin\pythonProject\0322_02","app.py")
with open("./report"+now+".html","wb") as fp:
runner=HTMLTestRunner(stream=fp,title="test",description="first")
runner.run(suite)
利用企业微信api测试会议室api
demo:
import requests
url=xxxxxxxxxxxxxxxxxxxxxx
request.get(url)
BasePage类:
创建setupCls,
创建BaseCase继承unit test,用json获取接口
import unittest
import requests
class BaseCase(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wwcbed2b77ca1bea09&corpsecret=xDgWbqrkUrotJR54pSChlp-baZFxG1REo7_d0gmfbD8"
r = requests.get(url)
cls.token = r.json()['access_token']
重写DEMO类并尝试获取打印token:
import requests
import unittest
from core.basecase import BaseCase
class TestDemo(BaseCase):
def test_01(self):
self.token
print(self.token)
def test_02(self):
self.token
print(self.token)
if __name__ == '__main__':
unittest.main(verbosity=2)
yaml文件的写入:
weixin:
corpid: wwcbed2b77ca1bea09 #id
corpsecrets: #xDgWbqrkUrotJR54pSChlp-baZFxG1REo7_d0gmfbD8
mettingroom: xDgWbqrkUrotJR54pSChlp-baZFxG1REo7_d0gmfbD8 #
python读取yaml文件的方法:
yaml文件设置编码前不要有中文,否者会报错,并且不好排查!!!!
安装pip install pyyaml
import yaml
import os
filepath=os.path.join(os.path.dirname(__file__),"configdata.yaml")
#或者
#filePath=os.path.join(r"D:\pycharm\PyCharm Community Edition 2021.1.3\jbr\bin\pythonProject\qiyeweixin\config\configdata.yaml")
with open(filepath) as file:
configdata=yaml.safe_load(file)
print(configdata)
获取到token后把BaseCase的url写成变量-----------json格式
引用json和yaml的数据变量一定是f+大括号f{}{configdata['weixin']['corpid']}
url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={configdata['weixin']['corpid']}&corpsecret={configdata['weixin']['corpsecrets']['mettingroom']}"
import unittest
import requests
from config import configdata
class BaseCase(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={configdata['weixin']['corpid']}&corpsecret={configdata['weixin']['corpsecrets']['mettingroom']}"
r = requests.get(url)
cls.token = r.json()['access_token']
加日志,打印到控制台并输出到文件:
""""
1实现控台输出
2运行日志记录到文件
"""
import logging
import os
import unittest
logger=logging.getLogger("wxapi")
logger.setLevel(logging.DEBUG)
formatter=logging.Formatter("%(asctime)s %(levelname)s %(message)s")
sh=logging.StreamHandler()
sh.setFormatter(formatter)
sh.setLevel(logging.DEBUG)
#添加控制台输出
logger.addHandler(sh)
#定义日志存放路径
logPath=os.path.join(r"D:\pycharm\PyCharm Community Edition 2021.1.3\jbr\bin\pythonProject\testapi3\logs")
if not os.path.exists(logPath):
os.mkdir(logPath)
logfile=os.path.join(logPath+"./wxapi.log")
fh=logging.FileHandler(logfile)
fh.setFormatter(formatter)
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
if __name__ == '__main__':
logger.info("this is test")
td添加会议室和上下游传参:
import random
from pojo import MeetingRoom
from core.basecase import BaseCase
class TestMeetingRoom(BaseCase):
def test_add_meeting(self):
"""
添加会议室
:return:
"""
url=f"https://qyapi.weixin.qq.com/cgi-bin/oa/meetingroom/add?access_token={self.token}"
data=(
{
"name": f"{random.random()}F-会议室",
"capacity": 10,
"city": "深圳",
"building": "腾讯大厦",
"floor": "18F",
"equipment": [1, 2, 3],
"coordinate":
{
"latitude": "22.540503",
"longitude": "113.934528"
}
}
)
r=self.requests(method="post",url=url,json=data)
#添加断言
self.assertEqual(r.json()["errcode"],0)
self.assertEqual(r.json()["errmsg"],"ok")
#设置上下游传参
MeetingRoom.meetingroom_id=r.json()["meetingroom_id"]
def test_del_meetingroom(self):
url=f"https://qyapi.weixin.qq.com/cgi-bin/oa/meetingroom/del?access_token={self.token}"
deldata={
"meetingroom_id":MeetingRoom.meetingroom_id
}
r=self.requests(method="post",url=url,json=deldata)
#添加断言
self.assertEqual(r.json()["errcode"],0)
self.assertEqual(r.json()["errmsg"],"ok")
复杂断言问题的处理:
def test_02query_meeting(self):
'''
查询会议室
:return:
'''
url=f"https://qyapi.weixin.qq.com/cgi-bin/oa/meetingroom/list?access_token={self.token}"
querydata={
"city":"深圳",
"building":"腾讯大厦",
"floor":"18F",
"equipment":[1,2,3]
}
r=self.requests(method="post",url=url,json=querydata)
meetingroom_list=r.json()["meetingroom_list"]
tmplist=[]
for meetingroom in meetingroom_list:
tmplist.append(meetingroom["meetingroom_id"])
#print(tmplist)
#添加断言:会议室id在tmplist中
self.assertTrue(MeetingRoom.meetingroom_id in tmplist)
简单的ddt数据驱动入门:不方便,
from ddt import ddt,data,unpack
from core.basecase import BaseCase
@ddt
class TestMeetingRoomDDT(BaseCase):
@data(["1234567890123456789012345678901",40058,'name exceed max utf8 words 30'],["",40058,'missing paramters name'])
@unpack
def test_add_meeting(self,name,expect_errcode,except_errmsg):
'''
测试异常场景
:return:
'''
url = f"https://qyapi.weixin.qq.com/cgi-bin/oa/meetingroom/add?access_token={self.token}"
data = {
"name": name,
"capacity": 10
}
r = self.requests(method="post", url=url, json=data)
# 添加断言
self.assertEqual(r.json()["errcode"], expect_errcode)
#self.assertEqual(r.json()["errmsg"], "ok")
self.assertTrue(except_errmsg in r.json()["errmsg"])
json格式:注意和yaml格式的区别
{
"name_value_more_than_31": {
"name": "1234567890123456789012345678901",
"expect_errcode": 40058,
"expect_errmsg": "name exceed max utf8 words 30"
},
"name_value_is_null": {
"name": "",
"expect_errcode": 40058,
"expect_errmsg": "missing paramters name"
}
}
使用json文件进行数据驱动:
class TestMeetingRoomDDT(BaseCase):
@file_data(r"D:\pycharm\PyCharm Community Edition 2021.1.3\jbr\bin\pythonProject\testapi3\testdata\meetingroom\addmeetingroom.json")
def test_add_meetingroom_filedata(self,name,expect_errcode,expect_errmsg):
url = f"https://qyapi.weixin.qq.com/cgi-bin/oa/meetingroom/add?access_token={self.token}"
data = {
"name": name,
"capacity": 10
}
r = self.requests(method="post", url=url, json=data)
# 添加断言
self.assertEqual(r.json()["errcode"], expect_errcode)
yaml的数据驱动:
yaml格式:
name_value_more_than_31:
name: 1234567890123456789012345678901
expect_errcode: 40058
expect_errmsg: name exceed max utf8 words 30
name_value_is_null:
name: ''
expect_errcode: 40058
expect_errmsg: missing paramters name
yaml的数据驱动:
@ddt
class TestMeetingRoomDDT(BaseCase):
@file_data(r"D:\pycharm\PyCharm Community Edition 2021.1.3\jbr\bin\pythonProject\testapi3\testdata\meetingroom\addmeetingroom.yaml")
def test_add_meetingroom_yaml(self,name,expect_errcode,expect_errmsg):
url = f"https://qyapi.weixin.qq.com/cgi-bin/oa/meetingroom/add?access_token={self.token}"
data = {
"name": name,
"capacity": 10
}
r = self.requests(method="post", url=url, json=data)
# 添加断言
self.assertEqual(r.json()["errcode"], expect_errcode)
测试套件运行测试用例:
import unittest
from testcases.test_mettingroom import TestMeetingRoom
from test_ddt.test_meetingroom_ddt import TestMeetingRoomDDT
def allTests():
'''
执行所有的用例
:return:
'''
#测试套件
suite=unittest.TestSuite()
#测试加载器
loader=unittest.TestLoader()
alltests=loader.discover(start_dir="testcases")#文件路径
#添加到测试用例集
suite.addTests(alltests)
return alltests
#运行特定测试用例
def smokeTests():
suite=unittest.TestSuite()
loader=unittest.TestLoader()
suite.addTest(TestMeetingRoom("test_01add_meeting"))#运行单个用例
#添加多个测试用例要用loader
alltest=loader.loadTestsFromTestCase(TestMeetingRoom)#运行一个类的所有文件
suite.addTest(alltest)
return suite
if __name__ == '__main__':
runner=unittest.TextTestRunner(verbosity=2)
#runner.run(allTests())
runner.run(smokeTests())
测试报告:
from testcases.test_mettingroom import TestMeetingRoom
from test_ddt.test_meetingroom_ddt import TestMeetingRoomDDT
from BeautifulReport import BeautifulReport
if __name__ == '__main__':
#runner=unittest.TextTestRunner(verbosity=2)
#runner.run(allTests())
#runner.run(smokeTests())
runner=BeautifulReport(smokeTests())
runner.report(description="企业api的测试和使用",report_dir=r"D:\pycharm\PyCharm Community Edition 2021.1.3\jbr\bin\pythonProject\testapi3\report")