标签:from 意义 读取数据 物流 用户名 字典 option variable tca
主要包含三种测试:
实际上意义就是UI界面到数据库之间,数据流经过的所有过程。
LAMP(Linux Apache MySQL PHP)/LNMP(Linux Nginx MySQL PHP):只有 Web 服务器,没有应用服务器。
Linux / Windows + Java / Asp.net(C#) + Apache/Nginx + Tomcat/IIS + MySQL/Oracle/SQL server
我们需要关注的是 Web 接口测试。
Web 接口测试的方法:
Postman 原本是一个 Chrome 浏览器的插件,现在已经提供了 Windows、MacOS 和Linux 的独立安装版本。接下来用Windows的版本来进行安装和使用。
下载 Postman 的安装包,分为 32位 和 64位。https://www.getpostman.com
安装 Postman
注册用户(Sign Up) 并登录 (Sign In)
可以在多台电脑登录,做过的测试会自动同步。
安装完并且登录以后可以开始测试。
Web 接口通过 HTTP(S)请求,是一个URL,URL请求结果,会得到数据,数据的格式主要有两种,一种JSON,一种 XML。主要用JSON演示。
接下来用一个例子,来分别JSON和XML表示以下的表格数据。
employee_id | first_name | last_name | phone_number | hire_date | job_id | salary | |
---|---|---|---|---|---|---|---|
100 | Steven | King | SKING | 515.123.4567 | 6/17/1987 | AD_PRES | 24000 |
101 | Neena | Kochhar | NKOCHHAR | 515.123.4568 | 9/21/1989 | AD_VP | 17000 |
首先用 JSON的形式,JSON是“键值对”(Key Value)的形式
{
"employees": [{
"employee_id": 100,
"first_name": "Steven",
"last_name": "King",
"email": "SKING",
"phone_number": "515.123.4567",
"hire_date": "6/17/1987",
"job_id": "AD_PRES",
"salary": 24000
},
{
"employee_id": 101,
"first_name": "Neena",
"last_name": "Kochhar",
"email": "NKOCHHAR",
"phone_number": "515.123.4568",
"hire_date": "9/21/1989",
"job_id": "AD_VP",
"salary": 17000
}]
}
对应的 XML 格式:
<?xml version="1.0" encoding="UTF-8" ?>
<employees>
<employee>
<employee_id>100</employee_id>
<first_name>Steven</first_name>
<last_name>King</last_name>
<email>SKING</email>
<phone_number>515.123.4567</phone_number>
<hire_date>6/17/1987</hire_date>
<job_id>AD_PRES</job_id>
<salary>24000</salary>
</employee>
<employee>
<employee_id>101</employee_id>
<first_name>Neena</first_name>
<last_name>Kochhar</last_name>
<email>NKOCHHAR</email>
<phone_number>515.123.4568</phone_number>
<hire_date>9/21/1989</hire_date>
<job_id>AD_VP</job_id>
<salary>17000</salary>
</employee>
</employees>
Web 接口的定义来决定测试内容
接口的实质对象:数据
测试 心知天气 API:https://www.seniverse.com/
登录 心知天气 (先注册)
读 接口的 API 文档
以 获取实时天气作为示例:
API的方法和URL:GET, https://api.seniverse.com/v3/weather/now.json
API的参数:
参数名 | 参数类型 | 参数意义 | 是否必选 |
---|---|---|---|
key | string | 你的API密钥 | true |
location | string | 查询的地理位置 | true |
language | string | 结果表示的语言 | false,默认简体中文 |
unit | string | 结果表示的单位(华氏度,摄氏度) | false,默认摄氏度 |
参数名 | 参数类型 | 参数意义 |
---|---|---|
location | 对象:包括id, name, country, time_zone, time_zone_offset | |
now | 对象:包括 text,code, temperature, feel_like… | |
last_update | 日期 |
用Postman开始测试
new tab 中输入 方式,和URL
点击 Params 设置参数
点击 send 开始发送请求
查看请求结果是否有输出,格式是否和上述的响应参数对应
{
"results": [
{
"location": {
"id": "WS10730EM8EV",
"name": "Shenzhen",
"country": "CN",
"path": "Shenzhen,Shenzhen,Guangdong,China",
"timezone": "Asia/Shanghai",
"timezone_offset": "+08:00"
},
"now": {
"text": "Cloudy",
"code": "4",
"temperature": "25"
},
"last_update": "2017-05-09T10:05:00+08:00"
}
]
}
编辑 Tests 页面,添加断言。
var jsonData = JSON.parse(responseBody);
tests["检查城市名称"] = jsonData.results[0].location.name === "Shenzhen";
使用Postman 登录然之系统,测试登录接口
使用然之 4.2 或者以上版本
修改然之系统 配置文件 C:\xampp5\htdocs\ranzhi\config\my.php
,在最后添加一行配置,如下图:
$config->notEncryptedPwd = true;
重启 Apache
打开 Chrome,输入然之的网址,打开登录页面
打开 Fiddler,并设置 Chrome 进行抓包
在 Chrome 中进行登录,提交用户名和密码
在 Fiddler 中捕获刚刚的登录 POST 请求
打开 Postman,新建 URL,POST方法。
需要设置 Postman,点击 File | Settings,进行设置
在 Postman 输入刚刚 Fiddler 请求的 POST 的 URL
输入上述 URL
在 Fiddler 中复制请求的第二行到空行之间的 消息报头(Head),Postman 输入 Head
在 Fiddler 中复制请求的正文,在 Postman 中 body 选择 raw,并输入
在 Postman 的test 中输入以下测试内容:
var jsonData = JSON.parse(responseBody);
tests["检查locate"] = jsonData.locate === "\/sys\/index.html";
tests["检查result"] = jsonData.result === "success";
tests["Status code is 200"] = responseCode.code === 200;
在 Chrome 中退出登录,注意此步骤很重要,退出以后才能够进行 Postman 登录
在 Postman 中点击 Send,进行测试
查看 Postman 的运行结果。
?
Web 接口测试的准备
在上面四个的基础上,注意Web 接口需要认证,尤其是支付业务,这里用一个例子,并且是POST请求 + Basic Auth 认证,来阐述此部分。
示例的步骤:
打开 https://www.pingxx.com/ Ping++ 在线支付网站,注册一个账号,并登录,会自动创建一个应用。
进入自动创建的应用,进入应用的控制面板界面。
获取 APP[id]
,按如图的方式获取到,并等下使用
获取 Test Secret Key
,按照如图的方式获取到,并依旧等下使用
按照下操作,查阅 API 文档,并开始测试。
选择 Charge,创建一个 支付订单,查阅 API 文档的请求参数,响应参数,依旧 方法和URL
在Postman 中创建新的测试,输入 POST 和 URL
设置参数,其中需要用到 APP[id],为之前步骤获取到的。
在 请求中使用 认证,Basic Auth,输入 之前步骤获取到的 Test Secret Key,作为用户名。
添加测试断言。
用 JavaScript脚本,查询 JSON 对象的值,并做检查。点击右侧的现成菜单,会自动生成检查 JSON 的框架。
var jsonData = JSON.parse(responseBody);
tests["检查object值"] = jsonData.object === "charge";
tests["检查order_no值"] = jsonData.order_no === "99887766554433221100";
tests["检查amount值"] = jsonData.amount === 9900;
?
点击 Send 开始测试。
微信红包支付接口测试的接口描述
在 Postman 中输入 POST 方法和 URL
在 Postman 中 使用 Http Basic Auth 认证。输入之前获取的 Secret_test_key。根据 API文档进行的操作
在 Postman 中操作
输入 请求的参数,注意 POST 请求的请求参数,输入到 Body 中
?
在 Test 设置断言,刚才说要设置 Object 的验证。
输入以下内容:
var jsonData = JSON.parse(responseBody);
tests["检查 Object 属性"] = jsonData.object === "red_envelope";
tests["检查 金额 属性"] = jsonData.amount === 6000;
点击Send,检查。
到管理平台查看订单结果。
Postman 支持导出用例以及账户的同步功能。
接口实例:
天气预报接口:
接口URL: http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
网络服务描述语言: http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
该接口有5个方法:
通过输入参数,可以调用这些接口,并得到请求的数据。
查询本天气预报Web Services支持的国内外城市或地区信息:
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity?byProvinceName=广东
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity?byProvinceName=北京
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity?byProvinceName=上海
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity?byProvinceName=湖北
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity?byProvinceName=河南
查询获得本天气预报Web Services支持的洲、国内外省份和城市信息
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportDataSet
查询获得本天气预报Web Services支持的洲、国内外省份和城市信息
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportProvince
查询获得根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=深圳
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=59493
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=北京
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=54511
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=上海
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=58367
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=香港
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=45005
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=Chicago
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=72530
Postman 作为工具,有UI的工具可以完整的操作 Web API(Application Programming Interface),有些场景,还需要在自动化测试方案中操作 Web API。对于 Python 来说有两种主流的工具操作 HTTP Web API。
和 Selenium 一样,requests 也是第三方的工具库。类比 Selenium 操作浏览器,requests 操作 HTTP 请求。
部署 requests 的过程
pip install requests
requests 有两个常见的方法
上面两个方法都会返回一个 Response 类的对象。注意 Response 类 属于 requests。
作为自动化接口测试工具,类似于 Selenium,我们需要 用 Page-Object 方式进行设计
GET /weather/now.json
获取指定城市的天气实况。付费用户可获取全部数据,免费用户只返回天气现象文字、代码和气温3项数据。注:中国城市暂不支持云量和露点温度。
请求地址示例
参数
key
你的API密钥
location
所查询的位置参数值范围:城市ID
例如:location=WX4FBXXFKE4F城市中文名
例如:location=北京省市名称组合
例如:location=辽宁朝阳、location=北京朝阳城市拼音/英文名
例如:location=beijing(如拼音相同城市,可在之前加省份和空格,例:shanxi yulin)经纬度
例如:location=39.93:116.40**(纬度前经度在后,冒号分隔)**IP地址
例如:location=220.181.111.86(某些IP地址可能无法定位到城市)“ip”两个字母
自动识别请求IP地址,例如:location=ip
language
语言 (可选)参数值范围:点此查看
unit
单位 (可选)参数值范围:c
当参数为c时,温度c、风速km/h、能见度km、气压mbf
当参数为f时,温度f、风速mph、能见度mile、气压inch默认值:c
返回结果 200
{
"results": [{
"location": {
"id": "C23NB62W20TF",
"name": "西雅图",
"country": "US",
"timezone": "America/Los_Angeles",
"timezone_offset": "-07:00"
},
"now": {
"text": "多云", //天气现象文字
"code": "4", //天气现象代码
"temperature": "14", //温度,单位为c摄氏度或f华氏度
"feels_like": "14", //体感温度,单位为c摄氏度或f华氏度
"pressure": "1018", //气压,单位为mb百帕或in英寸
"humidity": "76", //相对湿度,0~100,单位为百分比
"visibility": "16.09", //能见度,单位为km公里或mi英里
"wind_direction": "西北", //风向文字
"wind_direction_degree": "340", //风向角度,范围0~360,0为正北,90为正东,180为正南,270为正西
"wind_speed": "8.05", //风速,单位为km/h公里每小时或mph英里每小时
"wind_scale": "2", //风力等级,请参考:http://baike.baidu.com/view/465076.htm
"clouds": "90", //云量,范围0~100,天空被云覆盖的百分比 #目前不支持中国城市#
"dew_point": "-12" //露点温度,请参考:http://baike.baidu.com/view/118348.htm #目前不支持中国城市#
},
"last_update": "2015-09-25T22:45:00-07:00" //数据更新时间(该城市的本地时间)
}]
}
具体的步骤:
封装 requests 到 box_requests.py
import requests
from model.http_response import HttpResponse
class BoxRequests:
def get(self, url, param):
"""
用 Get 的方式请求 URL
:param url:
:param param: 参数
:return: model 中的 HttpResponse 类的对象
"""
r = requests.get(url, param)
http_response = HttpResponse()
http_response.status_code = r.status_code
http_response.json_dict = r.json()
return http_response
HttpResponse
class HttpResponse:
status_code = None
json_dict = None
创建一个 page :senivers_realtime_weather_page.py
from base.box_requests import BoxRequests
class SeniversRealtimeWeatherPage:
base_url = "/weather/now.json"
def get_weather_by_ip(self, host, api_key):
"""
根据IP地址所在的地方查询天气
:param host:
:param api_key:
:return: 自定义的 HttpResponse 类的对象
"""
br = BoxRequests()
# 创建一个字典,用来传参数
param = {
"key": api_key,
"location": "ip"
}
# 用 host 和 全局 base_url 拼成 URL
http_response = br.get(host + self.base_url, param)
return http_response
创建一个 case :seniverse_api_tests.py
import unittest
from pages.api.senivers_realtime_weather_page import SeniversRealtimeWeatherPage
class SeniverseApiTests(unittest.TestCase):
api_key = None
page = None
host = None
def setUp(self):
self.api_key = “MJX11XSAPG”
self.host = “https://api.seniverse.com/v3”
self.page = SeniversRealtimeWeatherPage()
def test_query_realtime_weather_by_ip(self):
r = self.page.get_weather_by_ip(self.host, self.api_key)
self.assertEqual(200, r.status_code, “状态码返回不正确!”)
expected_city = “深圳”
actual_city = r.json_dict[“results”][0][“location”][“name”]
self.assertEqual(expected_city, actual_city, “城市名称与ip不相符合”)
if name == “main“:
unittest.main()
“`
?
示例如下:
请求:POST https://api.pingxx.com/v1/charges
发起一次支付请求时需要创建一个新的 charge
对象,获取一个可用的支付凭据用于客户端向第三方渠道发起支付请求。如果使用测试模式的 API Key,则不会发生真实交易。当支付成功后,Ping++ 会发送 Webhooks 通知。
请求参数 | |
---|---|
order_no**REQUIRED** | 商户订单号,适配每个渠道对此参数的要求,必须在商户系统内唯一。( alipay : 1-64 位, wx : 2-32 位, bfb : 1-20 位, upacp : 8-40 位, yeepay_wap :1-50 位, jdpay_wap :1-30 位, qpay :1-30 位, cmb_wallet :10 位纯数字字符串。注:除 cmb_wallet 外的其他渠道推荐使用 8-20 位,要求数字或字母,不允许特殊字符)。 |
app [ id ]EXPANDABLE****REQUIRED | 支付使用的 app 对象的 id , expandable 可展开,查看 如何获取App ID 。 |
channel**REQUIRED** | 支付使用的第三方支付渠道。参考 支付渠道属性值 。 |
amount**REQUIRED** | 订单总金额(必须大于0),单位为对应币种的最小货币单位,人民币为分。如订单总金额为 1 元, amount 为 100,么么贷商户请查看申请的借贷金额范围。 |
client_ip**REQUIRED** | 发起支付请求客户端的 IPv4 地址,如: 127.0.0.1。 |
currency**REQUIRED** | 三位 ISO 货币代码,目前仅支持人民币 cny 。 |
subject**REQUIRED** | 商品的标题,该参数最长为 32 个 Unicode 字符,银联全渠道( upacp / upacp_wap )限制在 32 个字节。 |
body**REQUIRED** | 商品的描述信息,该参数最长为 128 个 Unicode 字符,yeepay_wap 对于该参数长度限制为 100 个 Unicode 字符。 |
extra*optional* | 特定渠道发起交易时需要的额外参数,以及部分渠道支付成功返回的额外参数,详细参考 支付渠道 extra 参数说明 。 |
time_expire*optional* | 订单失效时间,用 Unix 时间戳表示。时间范围在订单创建后的 1 分钟到 15 天,默认为 1 天,创建时间以 Ping++ 服务器时间为准。 微信对该参数的有效值限制为 2 小时内;银联对该参数的有效值限制为 1 小时内。 |
metadata*optional* | 参考 元数据 。 |
description*optional* | 订单附加说明,最多 255 个 Unicode 字符。 |
返回
返回一个支付凭据 charge
对象。鉴于支付渠道对 order_no
的合法性要求,为了保证支付请求的正确处理,请务必保证对于同一支付渠道下,不同支付产品间 order_no
的唯一性。例如:已在微信公众号下使用的 order_no
则无法在微信支付以及微信公众号扫码下重复使用,该规则同样适用于其他同类渠道。如果发生错误,则会返回错误码和错误详情,详见 错误。
根据 Postman 执行这个测试的情况。选择以下的数据:
data:params
把上述的两个数据,变成Python 的字典传递到 requests.post() 中,
检查得到的响应中的 Json 对象的值。
修改 box_requests,添加 post_json方法
def post_json(self, url, data=None, json=None, **kwargs):
"""
用 POST 的方式请求 URL
:param url:
:param data: 提交的数据
:param json: 提交的 json (可选)
:param kwargs: 额外的参数
:return:
"""
r = requests.post(url, data, json, **kwargs)
http_response = HttpResponse()
http_response.status_code = r.status_code
http_response.json_dict = r.json()
return http_response
创建 page,为测试用例服务
class PingxxChargeCreatePage:
base_url = "/charges"
def create_charge(self, host, data, headers):
br = BoxRequests()
# 用 host 和 全局 base_url 拼成 URL
http_response = br.post_json(host + self.base_url,
data=data,
headers=headers)
return http_response
创建 test_case
import unittest
from pages.api.pingxx_charge_create_page import PingxxChargeCreatePage
class PingxxApiTests(unittest.TestCase):
test_secret_key = None
app_id = None
page = None
host = None
def setUp(self):
self.app_id = "app_rfv1SGmPKijLnPef"
self.test_secret_key = "c2tfdGVzdF80bXpqelRpenpQQ0NqVEt5VEN5VGVqYlA6"
self.host = "https://api.pingxx.com/v1"
self.page = PingxxChargeCreatePage()
def test_create_charge_by_wechat(self):
data = {
"order_no": "88888888666666664444444422222222",
"app[id]": self.app_id,
"channel": "wx",
"amount": 10000000,
"client_ip": "192.168.1.202",
"currency": "cny",
"subject": "iphone 999 正品行货",
"body": "正规的水货 iphone 8 1000台",
"description": "iphone 8 一打。。。。订单附加说明,最多 255 个 Unicode 字符。"
}
headers = {"Authorization": "Basic %s" % self.test_secret_key}
r = self.page.create_charge(self.host, data, headers)
self.assertEqual(200, r.status_code, "状态码返回不正确!")
expected_object = "charge"
actual_object = r.json_dict["object"]
self.assertEqual(expected_object, actual_object, "对象是否为支付检查失败!")
if name == “main“:
unittest.main()
“`
标签:from 意义 读取数据 物流 用户名 字典 option variable tca
原文地址:https://www.cnblogs.com/mrgavin/p/9372060.html