Commit 737ea123 authored by liyuanhong's avatar liyuanhong

首次提交

parents
Pipeline #169 failed with stages
.idea/*
venv/*
\ No newline at end of file
# coding: utf-8
# 用户名
USER_NAME = "13146201116"
# 密码
PASSWORD = "Lyh123456"
# 车机号
CAR_DIN = "M202003060518"
# 域名
HOST = "api-test.vandyo.com"
# 请求头公共参数
HEADER = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
SID = ""
UID = ""
# 车机id (区别于硬件的车机号)
CAR_ID = ""
# http url前缀
HTTP_PREFIX = "http://"
# https url前缀
HTTPS_PREFIX = "https://"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>车安优App接口测试</title>
<meta name="generator" content="HTMLTestRunner 0.8.2"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css" media="screen">
body { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; }
table { font-size: 100%; }
pre { white-space: pre-wrap; }
/* -- heading ---------------------------------------------------------------------- */
h1 {
font-size: 16pt;
color: gray;
}
.heading {
margin-top: 0ex;
margin-bottom: 1ex;
}
.heading .attribute {
margin-top: 1ex;
margin-bottom: 0;
}
.heading .description {
margin-top: 4ex;
margin-bottom: 6ex;
}
/* -- css div popup ------------------------------------------------------------------------ */
a.popup_link {
}
a.popup_link:hover {
color: red;
}
.popup_window {
display: none;
position: relative;
left: 0px;
top: 0px;
/*border: solid #627173 1px; */
padding: 10px;
background-color: #E6E6D6;
font-family: "Lucida Console", "Courier New", Courier, monospace;
text-align: left;
font-size: 8pt;
width: 500px;
}
}
/* -- report ------------------------------------------------------------------------ */
#show_detail_line {
margin-top: 3ex;
margin-bottom: 1ex;
}
#result_table {
width: 80%;
border-collapse: collapse;
border: 1px solid #777;
}
#header_row {
font-weight: bold;
color: white;
background-color: #777;
}
#result_table td {
border: 1px solid #777;
padding: 2px;
}
#total_row { font-weight: bold; }
.passClass { background-color: #6c6; }
.failClass { background-color: #c60; }
.errorClass { background-color: #c00; }
.passCase { color: #6c6; }
.failCase { color: #c60; font-weight: bold; }
.errorCase { color: #c00; font-weight: bold; }
.hiddenRow { display: none; }
.testcase { margin-left: 2em; }
/* -- ending ---------------------------------------------------------------------- */
#ending {
}
</style>
</head>
<body>
<script language="javascript" type="text/javascript"><!--
output_list = Array();
/* level - 0:Summary; 1:Failed; 2:All */
function showCase(level) {
trs = document.getElementsByTagName("tr");
for (var i = 0; i < trs.length; i++) {
tr = trs[i];
id = tr.id;
if (id.substr(0,2) == 'ft') {
if (level < 1) {
tr.className = 'hiddenRow';
}
else {
tr.className = '';
}
}
if (id.substr(0,2) == 'pt') {
if (level > 1) {
tr.className = '';
}
else {
tr.className = 'hiddenRow';
}
}
}
}
function showClassDetail(cid, count) {
var id_list = Array(count);
var toHide = 1;
for (var i = 0; i < count; i++) {
tid0 = 't' + cid.substr(1) + '.' + (i+1);
tid = 'f' + tid0;
tr = document.getElementById(tid);
if (!tr) {
tid = 'p' + tid0;
tr = document.getElementById(tid);
}
id_list[i] = tid;
if (tr.className) {
toHide = 0;
}
}
for (var i = 0; i < count; i++) {
tid = id_list[i];
if (toHide) {
document.getElementById('div_'+tid).style.display = 'none'
document.getElementById(tid).className = 'hiddenRow';
}
else {
document.getElementById(tid).className = '';
}
}
}
function showTestDetail(div_id){
var details_div = document.getElementById(div_id)
var displayState = details_div.style.display
// alert(displayState)
if (displayState != 'block' ) {
displayState = 'block'
details_div.style.display = 'block'
}
else {
details_div.style.display = 'none'
}
}
function html_escape(s) {
s = s.replace(/&/g,'&amp;');
s = s.replace(/</g,'&lt;');
s = s.replace(/>/g,'&gt;');
return s;
}
/* obsoleted by detail in <div>
function showOutput(id, name) {
var w = window.open("", //url
name,
"resizable,scrollbars,status,width=800,height=450");
d = w.document;
d.write("<pre>");
d.write(html_escape(output_list[id]));
d.write("\n");
d.write("<a href='javascript:window.close()'>close</a>\n");
d.write("</pre>\n");
d.close();
}
*/
--></script>
<div class='heading'>
<h1>车安优App接口测试</h1>
<p class='attribute'><strong>开始测试时间::</strong> 2020-05-22 16:37:27</p>
<p class='attribute'><strong>测试耗时::</strong> 0:00:03.381024</p>
<p class='attribute'><strong>状态::</strong> 通过 14 失败 1</p>
<p class='description'>车安优App拨测程序测试报告...</p>
</div>
<p id='show_detail_line'>展示
<a href='javascript:showCase(0)'>收起报告</a>
<a href='javascript:showCase(1)'>查看失败</a>
<a href='javascript:showCase(2)'>展开报告</a>
</p>
<table id='result_table'>
<colgroup>
<col align='left' />
<col align='right' />
<col align='right' />
<col align='right' />
<col align='right' />
<col align='right' />
</colgroup>
<tr id='header_row'>
<td>Test Group/Test case</td>
<td>Count</td>
<td>Pass</td>
<td>Fail</td>
<td>Error</td>
<td>View</td>
</tr>
<tr class='failClass'>
<td>testCase.User_interface_cases.User_interface_cases</td>
<td>12</td>
<td>11</td>
<td>1</td>
<td>0</td>
<td><a href="javascript:showClassDetail('c1',12)">Detail</a></td>
</tr>
<tr id='pt1.1' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_authorize_pwd_login</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1')" >
pass</a>
<div id='div_pt1.1' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.1').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.1:
请求地址:http://api-test.vandyo.com/user/authorize/pwd/login
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"sid":"ef88e908c93a4fe29f1a07014bb92401","uid":"7c25eb4194504b2fa99d3f10ef4e0c3b","mobile":"13146201116","isbind":1,"refreshToken":null}}
接口响应时间:306毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.2' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_mall_goods_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.2')" >
pass</a>
<div id='div_pt1.2' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.2').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.2:
请求地址:http://api-test.vandyo.com/user/mall/goods/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"bl":[{"name":"商城优选1","url":"http://test.pay.vandyo.com/activity/yangche/#/detail?type=1&amp;id=2","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//mallgoods/1578560813363.jpeg","order":2}],"ob":[{"name":"咨询","url":"http://dev.pay.vandyo.com/leasemachine/weixin/h5pay?orderId=5434gfegd433","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//mallgoods/1579243433367.jpg","order":2}],"re":[]}}
接口响应时间:219毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.3' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_third_party_app_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.3')" >
pass</a>
<div id='div_pt1.3' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.3').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.3:
请求地址:http://api-test.vandyo.com/user/third/party/app/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"name":"转盘活动测试","appUrl":"http://test.pay.vandyo.com/activity/gift/","imgUrl":"https://proyuna.obs.cn-north-4.myhuaweicloud.com/vip/menu/1586846046861.png","order":-2,"orderType":0},{"name":"转盘跳转地址","appUrl":"http://test.pay.vandyo.com/activity/readypan/","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//appconf/1589447060345.png","order":-1,"orderType":0},{"name":"道路救援","appUrl":"https://html.vandyo.com/carshop/tellist.html","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage/appconf/1576567340018.png","order":1,"orderType":1},{"name":"健康出行","appUrl":"https://test-shop.vandyo.com/tuanyou/#/","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//appconf/1589184868997.png","order":2,"orderType":1}]}
接口响应时间:203毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.4' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_business_cooperation_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.4')" >
pass</a>
<div id='div_pt1.4' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.4').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.4:
请求地址:http://api-test.vandyo.com/user/business/cooperation/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"保存成功","result":null}
接口响应时间:242毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.5' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_info_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.5')" >
pass</a>
<div id='div_pt1.5' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.5').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.5:
请求地址:http://api-test.vandyo.com/user/info/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"uid":"7c25eb4194504b2fa99d3f10ef4e0c3b","nickname":"","path":"","mobile":"13146201116","sex":1,"level":0,"card":0}}
接口响应时间:205毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.6' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_pop_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.6')" >
pass</a>
<div id='div_pt1.6' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.6').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.6:
请求地址:http://api-test.vandyo.com/user/pop/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"adverts":null}}
接口响应时间:218毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.7' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_banner_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.7')" >
pass</a>
<div id='div_pt1.7' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.7').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.7:
请求地址:http://api-test.vandyo.com/user/banner/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"name":"banner2","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//bannerad/1589350549161.jpg","url":"http://test.pay.vandyo.com/activity/subscribe ","order":2}]}
接口响应时间:239毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.8' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_flash_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.8')" >
pass</a>
<div id='div_pt1.8' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.8').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.8:
请求地址:http://api-test.vandyo.com/user/flash/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"adverts":null}}
接口响应时间:196毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='ft1.9' class='none'>
<td class='failCase'><div class='testcase'>test_user_car_msg_config_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_ft1.9')" >
fail</a>
<div id='div_ft1.9' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_ft1.9').style.display = 'none' " >
[x]</a>
</div>
<pre>
ft1.9:
请求地址:http://api-test.vandyo.com/user/car_msg/config/get
-------------------------返回结果:-------------------------
{"error":3001,"msg":"该车不属于当前用户","result":null}
Traceback (most recent call last):
File "D:\myProgram\python\interfaceTest\testCase\User_interface_cases.py", line 204, in test_user_car_msg_config_get
self.baseAssert(resObj)
File "D:\myProgram\python\interfaceTest\testCase\User_interface_cases.py", line 278, in baseAssert
self.assertEqual(error, 0, "接口返回错误:" + str(error) + " content: " + resObj.text)
AssertionError: 3001 != 0 : 接口返回错误:3001 content: {"error":3001,"msg":"该车不属于当前用户","result":null}
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.10' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_user_msg_config_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.10')" >
pass</a>
<div id='div_pt1.10' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.10').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.10:
请求地址:http://api-test.vandyo.com/user/user_msg/config/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"total":1,"sys":1}}
接口响应时间:199毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.11' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_config_version_update_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.11')" >
pass</a>
<div id='div_pt1.11' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.11').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.11:
请求地址:http://api-test.vandyo.com/user/config/version/update/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"version":null,"des":null,"url":null,"update":0,"apkurl":null,"showprompt":null}}
接口响应时间:195毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.12' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_menu_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.12')" >
pass</a>
<div id='div_pt1.12' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.12').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.12:
请求地址:http://api-test.vandyo.com/user/menu/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"my_menus":[]}}
接口响应时间:197毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr class='passClass'>
<td>testCase.Car_interface_cases.Car_interface_cases</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>0</td>
<td><a href="javascript:showClassDetail('c2',3)">Detail</a></td>
</tr>
<tr id='pt2.1' class='hiddenRow'>
<td class='none'><div class='testcase'>test_car_my_car_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt2.1')" >
pass</a>
<div id='div_pt2.1' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt2.1').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt2.1:
请求地址:http://api-test.vandyo.com/car/my_car/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"cid":"840ace3de46c44d5b0737941095b1dd8","plate":"渝A12321","nickname":"","din":"M202003060518","bind":"1","typeid":"916","typename":"奥驰T系","modelid":"10002909","modelname":"3.8L 手动 T2 自卸车3.64米 129马力 FD3043P10K4","cbrand":"https://proyuna.obs.cn-north-4.myhuaweicloud.com:443/car/brand/1585202563162.png","addtime":"1589372400"}]}
接口响应时间:197毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt2.2' class='hiddenRow'>
<td class='none'><div class='testcase'>test_car_my_car_info</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt2.2')" >
pass</a>
<div id='div_pt2.2' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt2.2').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt2.2:
请求地址:http://api-test.vandyo.com/car/my_car/info
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"cid":"840ace3de46c44d5b0737941095b1dd8","plate":"渝A12321","nickname":"","din":"M202003060518","bind":"1","displacement":"3.8L/T","typeid":"916","typename":"奥驰T系","modelid":"10002909","modelname":"2015款","cbrand":"https://proyuna.obs.cn-north-4.myhuaweicloud.com:443/car/brand/1585202563162.png","gasno":"0","engine":"","vin":"","bxexpiretime":"","insurance":"","bxcity":"","bxlasttime":"","notmodifymile":0,"tipmodifymile":"行驶总里程与仪表盘数据同步,不可修改","mile":"11530","mlast":"","mmile":"","lastmiletime":"","register":"","nsexpiretime":"","nslasttime":"","addtime":"1589372400"}}
接口响应时间:236毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt2.3' class='hiddenRow'>
<td class='none'><div class='testcase'>test_car_my_man_speak</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt2.3')" >
pass</a>
<div id='div_pt2.3' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt2.3').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt2.3: {'cid': '840ace3de46c44d5b0737941095b1dd8', 'message': '剩余油量'}
请求地址:http://api-test.vandyo.com/car/man/speak
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"type":"1","message":"{\"txt\": \"我的【剩余油量】:\\n50.5%\"}","msgid":"043b09df14ab4a4aba7e9da8f2f85aeb","mid":"840ace3de46c44d5b0737941095b1dd8","mtype":"2","sendtime":1590136649}]}
接口响应时间:232毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='total_row'>
<td>Total</td>
<td>15</td>
<td>14</td>
<td>1</td>
<td>0</td>
<td>&nbsp;</td>
</tr>
</table>
<div id='ending'>&nbsp;</div>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>车安优App接口测试</title>
<meta name="generator" content="HTMLTestRunner 0.8.2"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css" media="screen">
body { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; }
table { font-size: 100%; }
pre { white-space: pre-wrap; }
/* -- heading ---------------------------------------------------------------------- */
h1 {
font-size: 16pt;
color: gray;
}
.heading {
margin-top: 0ex;
margin-bottom: 1ex;
}
.heading .attribute {
margin-top: 1ex;
margin-bottom: 0;
}
.heading .description {
margin-top: 4ex;
margin-bottom: 6ex;
}
/* -- css div popup ------------------------------------------------------------------------ */
a.popup_link {
}
a.popup_link:hover {
color: red;
}
.popup_window {
display: none;
position: relative;
left: 0px;
top: 0px;
/*border: solid #627173 1px; */
padding: 10px;
background-color: #E6E6D6;
font-family: "Lucida Console", "Courier New", Courier, monospace;
text-align: left;
font-size: 8pt;
width: 500px;
}
}
/* -- report ------------------------------------------------------------------------ */
#show_detail_line {
margin-top: 3ex;
margin-bottom: 1ex;
}
#result_table {
width: 80%;
border-collapse: collapse;
border: 1px solid #777;
}
#header_row {
font-weight: bold;
color: white;
background-color: #777;
}
#result_table td {
border: 1px solid #777;
padding: 2px;
}
#total_row { font-weight: bold; }
.passClass { background-color: #6c6; }
.failClass { background-color: #c60; }
.errorClass { background-color: #c00; }
.passCase { color: #6c6; }
.failCase { color: #c60; font-weight: bold; }
.errorCase { color: #c00; font-weight: bold; }
.hiddenRow { display: none; }
.testcase { margin-left: 2em; }
/* -- ending ---------------------------------------------------------------------- */
#ending {
}
</style>
</head>
<body>
<script language="javascript" type="text/javascript"><!--
output_list = Array();
/* level - 0:Summary; 1:Failed; 2:All */
function showCase(level) {
trs = document.getElementsByTagName("tr");
for (var i = 0; i < trs.length; i++) {
tr = trs[i];
id = tr.id;
if (id.substr(0,2) == 'ft') {
if (level < 1) {
tr.className = 'hiddenRow';
}
else {
tr.className = '';
}
}
if (id.substr(0,2) == 'pt') {
if (level > 1) {
tr.className = '';
}
else {
tr.className = 'hiddenRow';
}
}
}
}
function showClassDetail(cid, count) {
var id_list = Array(count);
var toHide = 1;
for (var i = 0; i < count; i++) {
tid0 = 't' + cid.substr(1) + '.' + (i+1);
tid = 'f' + tid0;
tr = document.getElementById(tid);
if (!tr) {
tid = 'p' + tid0;
tr = document.getElementById(tid);
}
id_list[i] = tid;
if (tr.className) {
toHide = 0;
}
}
for (var i = 0; i < count; i++) {
tid = id_list[i];
if (toHide) {
document.getElementById('div_'+tid).style.display = 'none'
document.getElementById(tid).className = 'hiddenRow';
}
else {
document.getElementById(tid).className = '';
}
}
}
function showTestDetail(div_id){
var details_div = document.getElementById(div_id)
var displayState = details_div.style.display
// alert(displayState)
if (displayState != 'block' ) {
displayState = 'block'
details_div.style.display = 'block'
}
else {
details_div.style.display = 'none'
}
}
function html_escape(s) {
s = s.replace(/&/g,'&amp;');
s = s.replace(/</g,'&lt;');
s = s.replace(/>/g,'&gt;');
return s;
}
/* obsoleted by detail in <div>
function showOutput(id, name) {
var w = window.open("", //url
name,
"resizable,scrollbars,status,width=800,height=450");
d = w.document;
d.write("<pre>");
d.write(html_escape(output_list[id]));
d.write("\n");
d.write("<a href='javascript:window.close()'>close</a>\n");
d.write("</pre>\n");
d.close();
}
*/
--></script>
<div class='heading'>
<h1>车安优App接口测试</h1>
<p class='attribute'><strong>开始测试时间::</strong> 2020-05-22 16:44:20</p>
<p class='attribute'><strong>测试耗时::</strong> 0:00:03.360780</p>
<p class='attribute'><strong>状态::</strong> 通过 14 失败 1</p>
<p class='description'>车安优App拨测程序测试报告...</p>
</div>
<p id='show_detail_line'>展示
<a href='javascript:showCase(0)'>收起报告</a>
<a href='javascript:showCase(1)'>查看失败</a>
<a href='javascript:showCase(2)'>展开报告</a>
</p>
<table id='result_table'>
<colgroup>
<col align='left' />
<col align='right' />
<col align='right' />
<col align='right' />
<col align='right' />
<col align='right' />
</colgroup>
<tr id='header_row'>
<td>Test Group/Test case</td>
<td>Count</td>
<td>Pass</td>
<td>Fail</td>
<td>Error</td>
<td>View</td>
</tr>
<tr class='failClass'>
<td>testCase.User_interface_cases.User_interface_cases</td>
<td>12</td>
<td>11</td>
<td>1</td>
<td>0</td>
<td><a href="javascript:showClassDetail('c1',12)">Detail</a></td>
</tr>
<tr id='pt1.1' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_authorize_pwd_login</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1')" >
pass</a>
<div id='div_pt1.1' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.1').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.1:
请求地址:http://api-test.vandyo.com/user/authorize/pwd/login
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"sid":"dcd0345e82d149d6815086d6b565cd59","uid":"7c25eb4194504b2fa99d3f10ef4e0c3b","mobile":"13146201116","isbind":1,"refreshToken":null}}
接口响应时间:316毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.2' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_mall_goods_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.2')" >
pass</a>
<div id='div_pt1.2' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.2').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.2:
请求地址:http://api-test.vandyo.com/user/mall/goods/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"bl":[{"name":"商城优选1","url":"http://test.pay.vandyo.com/activity/yangche/#/detail?type=1&amp;id=2","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//mallgoods/1578560813363.jpeg","order":2}],"ob":[{"name":"咨询","url":"http://dev.pay.vandyo.com/leasemachine/weixin/h5pay?orderId=5434gfegd433","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//mallgoods/1579243433367.jpg","order":2}],"re":[]}}
接口响应时间:246毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.3' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_third_party_app_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.3')" >
pass</a>
<div id='div_pt1.3' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.3').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.3:
请求地址:http://api-test.vandyo.com/user/third/party/app/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"name":"转盘活动测试","appUrl":"http://test.pay.vandyo.com/activity/gift/","imgUrl":"https://proyuna.obs.cn-north-4.myhuaweicloud.com/vip/menu/1586846046861.png","order":-2,"orderType":0},{"name":"转盘跳转地址","appUrl":"http://test.pay.vandyo.com/activity/readypan/","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//appconf/1589447060345.png","order":-1,"orderType":0},{"name":"道路救援","appUrl":"https://html.vandyo.com/carshop/tellist.html","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage/appconf/1576567340018.png","order":1,"orderType":1},{"name":"健康出行","appUrl":"https://test-shop.vandyo.com/tuanyou/#/","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//appconf/1589184868997.png","order":2,"orderType":1}]}
接口响应时间:197毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.4' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_business_cooperation_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.4')" >
pass</a>
<div id='div_pt1.4' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.4').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.4:
请求地址:http://api-test.vandyo.com/user/business/cooperation/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"保存成功","result":null}
接口响应时间:221毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.5' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_info_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.5')" >
pass</a>
<div id='div_pt1.5' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.5').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.5:
请求地址:http://api-test.vandyo.com/user/info/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"uid":"7c25eb4194504b2fa99d3f10ef4e0c3b","nickname":"","path":"","mobile":"13146201116","sex":1,"level":0,"card":0}}
接口响应时间:232毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.6' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_pop_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.6')" >
pass</a>
<div id='div_pt1.6' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.6').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.6:
请求地址:http://api-test.vandyo.com/user/pop/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"adverts":null}}
接口响应时间:219毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.7' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_banner_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.7')" >
pass</a>
<div id='div_pt1.7' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.7').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.7:
请求地址:http://api-test.vandyo.com/user/banner/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"name":"banner2","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//bannerad/1589350549161.jpg","url":"http://test.pay.vandyo.com/activity/subscribe ","order":2}]}
接口响应时间:216毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.8' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_flash_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.8')" >
pass</a>
<div id='div_pt1.8' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.8').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.8:
请求地址:http://api-test.vandyo.com/user/flash/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"adverts":null}}
接口响应时间:195毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='ft1.9' class='none'>
<td class='failCase'><div class='testcase'>test_user_car_msg_config_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_ft1.9')" >
fail</a>
<div id='div_ft1.9' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_ft1.9').style.display = 'none' " >
[x]</a>
</div>
<pre>
ft1.9:
请求地址:http://api-test.vandyo.com/user/car_msg/config/get
-------------------------返回结果:-------------------------
{"error":3001,"msg":"该车不属于当前用户","result":null}
Traceback (most recent call last):
File "D:\myProgram\python\interfaceTest\testCase\User_interface_cases.py", line 204, in test_user_car_msg_config_get
self.baseAssert(resObj)
File "D:\myProgram\python\interfaceTest\testCase\User_interface_cases.py", line 278, in baseAssert
self.assertEqual(error, 0, "接口返回错误:" + str(error) + " content: " + resObj.text)
AssertionError: 3001 != 0 : 接口返回错误:3001 content: {"error":3001,"msg":"该车不属于当前用户","result":null}
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.10' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_user_msg_config_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.10')" >
pass</a>
<div id='div_pt1.10' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.10').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.10:
请求地址:http://api-test.vandyo.com/user/user_msg/config/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"total":1,"sys":1}}
接口响应时间:199毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.11' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_config_version_update_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.11')" >
pass</a>
<div id='div_pt1.11' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.11').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.11:
请求地址:http://api-test.vandyo.com/user/config/version/update/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"version":null,"des":null,"url":null,"update":0,"apkurl":null,"showprompt":null}}
接口响应时间:218毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.12' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_menu_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.12')" >
pass</a>
<div id='div_pt1.12' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.12').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.12:
请求地址:http://api-test.vandyo.com/user/menu/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"my_menus":[]}}
接口响应时间:216毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr class='passClass'>
<td>testCase.Car_interface_cases.Car_interface_cases</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>0</td>
<td><a href="javascript:showClassDetail('c2',3)">Detail</a></td>
</tr>
<tr id='pt2.1' class='hiddenRow'>
<td class='none'><div class='testcase'>test_car_my_car_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt2.1')" >
pass</a>
<div id='div_pt2.1' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt2.1').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt2.1:
请求地址:http://api-test.vandyo.com/car/my_car/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"cid":"840ace3de46c44d5b0737941095b1dd8","plate":"渝A12321","nickname":"","din":"M202003060518","bind":"1","typeid":"916","typename":"奥驰T系","modelid":"10002909","modelname":"3.8L 手动 T2 自卸车3.64米 129马力 FD3043P10K4","cbrand":"https://proyuna.obs.cn-north-4.myhuaweicloud.com:443/car/brand/1585202563162.png","addtime":"1589372400"}]}
接口响应时间:222毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt2.2' class='hiddenRow'>
<td class='none'><div class='testcase'>test_car_my_car_info</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt2.2')" >
pass</a>
<div id='div_pt2.2' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt2.2').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt2.2:
请求地址:http://api-test.vandyo.com/car/my_car/info
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"cid":"840ace3de46c44d5b0737941095b1dd8","plate":"渝A12321","nickname":"","din":"M202003060518","bind":"1","displacement":"3.8L/T","typeid":"916","typename":"奥驰T系","modelid":"10002909","modelname":"2015款","cbrand":"https://proyuna.obs.cn-north-4.myhuaweicloud.com:443/car/brand/1585202563162.png","gasno":"0","engine":"","vin":"","bxexpiretime":"","insurance":"","bxcity":"","bxlasttime":"","notmodifymile":0,"tipmodifymile":"行驶总里程与仪表盘数据同步,不可修改","mile":"11530","mlast":"","mmile":"","lastmiletime":"","register":"","nsexpiretime":"","nslasttime":"","addtime":"1589372400"}}
接口响应时间:210毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt2.3' class='hiddenRow'>
<td class='none'><div class='testcase'>test_car_my_man_speak</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt2.3')" >
pass</a>
<div id='div_pt2.3' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt2.3').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt2.3: {'cid': '840ace3de46c44d5b0737941095b1dd8', 'message': '即时速度'}
请求地址:http://api-test.vandyo.com/car/man/speak
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"type":"1","message":"{\"txt\": \"我的【即时速度】:\\n0.0km/h\"}","msgid":"c634be8e10254ee2a3ea8bb7ca89773a","mid":"840ace3de46c44d5b0737941095b1dd8","mtype":"2","sendtime":1590137062}]}
接口响应时间:203毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='total_row'>
<td>Total</td>
<td>15</td>
<td>14</td>
<td>1</td>
<td>0</td>
<td>&nbsp;</td>
</tr>
</table>
<div id='ending'>&nbsp;</div>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>车安优App接口测试</title>
<meta name="generator" content="HTMLTestRunner 0.8.2"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css" media="screen">
body { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; }
table { font-size: 100%; }
pre { white-space: pre-wrap; }
/* -- heading ---------------------------------------------------------------------- */
h1 {
font-size: 16pt;
color: gray;
}
.heading {
margin-top: 0ex;
margin-bottom: 1ex;
}
.heading .attribute {
margin-top: 1ex;
margin-bottom: 0;
}
.heading .description {
margin-top: 4ex;
margin-bottom: 6ex;
}
/* -- css div popup ------------------------------------------------------------------------ */
a.popup_link {
}
a.popup_link:hover {
color: red;
}
.popup_window {
display: none;
position: relative;
left: 0px;
top: 0px;
/*border: solid #627173 1px; */
padding: 10px;
background-color: #E6E6D6;
font-family: "Lucida Console", "Courier New", Courier, monospace;
text-align: left;
font-size: 8pt;
width: 500px;
}
}
/* -- report ------------------------------------------------------------------------ */
#show_detail_line {
margin-top: 3ex;
margin-bottom: 1ex;
}
#result_table {
width: 80%;
border-collapse: collapse;
border: 1px solid #777;
}
#header_row {
font-weight: bold;
color: white;
background-color: #777;
}
#result_table td {
border: 1px solid #777;
padding: 2px;
}
#total_row { font-weight: bold; }
.passClass { background-color: #6c6; }
.failClass { background-color: #c60; }
.errorClass { background-color: #c00; }
.passCase { color: #6c6; }
.failCase { color: #c60; font-weight: bold; }
.errorCase { color: #c00; font-weight: bold; }
.hiddenRow { display: none; }
.testcase { margin-left: 2em; }
/* -- ending ---------------------------------------------------------------------- */
#ending {
}
</style>
</head>
<body>
<script language="javascript" type="text/javascript"><!--
output_list = Array();
/* level - 0:Summary; 1:Failed; 2:All */
function showCase(level) {
trs = document.getElementsByTagName("tr");
for (var i = 0; i < trs.length; i++) {
tr = trs[i];
id = tr.id;
if (id.substr(0,2) == 'ft') {
if (level < 1) {
tr.className = 'hiddenRow';
}
else {
tr.className = '';
}
}
if (id.substr(0,2) == 'pt') {
if (level > 1) {
tr.className = '';
}
else {
tr.className = 'hiddenRow';
}
}
}
}
function showClassDetail(cid, count) {
var id_list = Array(count);
var toHide = 1;
for (var i = 0; i < count; i++) {
tid0 = 't' + cid.substr(1) + '.' + (i+1);
tid = 'f' + tid0;
tr = document.getElementById(tid);
if (!tr) {
tid = 'p' + tid0;
tr = document.getElementById(tid);
}
id_list[i] = tid;
if (tr.className) {
toHide = 0;
}
}
for (var i = 0; i < count; i++) {
tid = id_list[i];
if (toHide) {
document.getElementById('div_'+tid).style.display = 'none'
document.getElementById(tid).className = 'hiddenRow';
}
else {
document.getElementById(tid).className = '';
}
}
}
function showTestDetail(div_id){
var details_div = document.getElementById(div_id)
var displayState = details_div.style.display
// alert(displayState)
if (displayState != 'block' ) {
displayState = 'block'
details_div.style.display = 'block'
}
else {
details_div.style.display = 'none'
}
}
function html_escape(s) {
s = s.replace(/&/g,'&amp;');
s = s.replace(/</g,'&lt;');
s = s.replace(/>/g,'&gt;');
return s;
}
/* obsoleted by detail in <div>
function showOutput(id, name) {
var w = window.open("", //url
name,
"resizable,scrollbars,status,width=800,height=450");
d = w.document;
d.write("<pre>");
d.write(html_escape(output_list[id]));
d.write("\n");
d.write("<a href='javascript:window.close()'>close</a>\n");
d.write("</pre>\n");
d.close();
}
*/
--></script>
<div class='heading'>
<h1>车安优App接口测试</h1>
<p class='attribute'><strong>开始测试时间::</strong> 2020-05-22 16:45:03</p>
<p class='attribute'><strong>测试耗时::</strong> 0:00:03.305924</p>
<p class='attribute'><strong>状态::</strong> 通过 14 失败 1</p>
<p class='description'>车安优App拨测程序测试报告...</p>
</div>
<p id='show_detail_line'>展示
<a href='javascript:showCase(0)'>收起报告</a>
<a href='javascript:showCase(1)'>查看失败</a>
<a href='javascript:showCase(2)'>展开报告</a>
</p>
<table id='result_table'>
<colgroup>
<col align='left' />
<col align='right' />
<col align='right' />
<col align='right' />
<col align='right' />
<col align='right' />
</colgroup>
<tr id='header_row'>
<td>Test Group/Test case</td>
<td>Count</td>
<td>Pass</td>
<td>Fail</td>
<td>Error</td>
<td>View</td>
</tr>
<tr class='failClass'>
<td>testCase.User_interface_cases.User_interface_cases</td>
<td>12</td>
<td>11</td>
<td>1</td>
<td>0</td>
<td><a href="javascript:showClassDetail('c1',12)">Detail</a></td>
</tr>
<tr id='pt1.1' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_authorize_pwd_login</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1')" >
pass</a>
<div id='div_pt1.1' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.1').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.1:
请求地址:http://api-test.vandyo.com/user/authorize/pwd/login
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"sid":"1cf991a5bea047688eed1ea3d9ca1256","uid":"7c25eb4194504b2fa99d3f10ef4e0c3b","mobile":"13146201116","isbind":1,"refreshToken":null}}
接口响应时间:307毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.2' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_mall_goods_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.2')" >
pass</a>
<div id='div_pt1.2' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.2').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.2:
请求地址:http://api-test.vandyo.com/user/mall/goods/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"bl":[{"name":"商城优选1","url":"http://test.pay.vandyo.com/activity/yangche/#/detail?type=1&amp;id=2","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//mallgoods/1578560813363.jpeg","order":2}],"ob":[{"name":"咨询","url":"http://dev.pay.vandyo.com/leasemachine/weixin/h5pay?orderId=5434gfegd433","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//mallgoods/1579243433367.jpg","order":2}],"re":[]}}
接口响应时间:200毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.3' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_third_party_app_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.3')" >
pass</a>
<div id='div_pt1.3' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.3').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.3:
请求地址:http://api-test.vandyo.com/user/third/party/app/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"name":"转盘活动测试","appUrl":"http://test.pay.vandyo.com/activity/gift/","imgUrl":"https://proyuna.obs.cn-north-4.myhuaweicloud.com/vip/menu/1586846046861.png","order":-2,"orderType":0},{"name":"转盘跳转地址","appUrl":"http://test.pay.vandyo.com/activity/readypan/","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//appconf/1589447060345.png","order":-1,"orderType":0},{"name":"道路救援","appUrl":"https://html.vandyo.com/carshop/tellist.html","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage/appconf/1576567340018.png","order":1,"orderType":1},{"name":"健康出行","appUrl":"https://test-shop.vandyo.com/tuanyou/#/","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//appconf/1589184868997.png","order":2,"orderType":1}]}
接口响应时间:224毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.4' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_business_cooperation_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.4')" >
pass</a>
<div id='div_pt1.4' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.4').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.4:
请求地址:http://api-test.vandyo.com/user/business/cooperation/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"保存成功","result":null}
接口响应时间:196毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.5' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_info_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.5')" >
pass</a>
<div id='div_pt1.5' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.5').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.5:
请求地址:http://api-test.vandyo.com/user/info/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"uid":"7c25eb4194504b2fa99d3f10ef4e0c3b","nickname":"","path":"","mobile":"13146201116","sex":1,"level":0,"card":0}}
接口响应时间:229毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.6' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_pop_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.6')" >
pass</a>
<div id='div_pt1.6' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.6').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.6:
请求地址:http://api-test.vandyo.com/user/pop/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"adverts":null}}
接口响应时间:194毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.7' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_banner_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.7')" >
pass</a>
<div id='div_pt1.7' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.7').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.7:
请求地址:http://api-test.vandyo.com/user/banner/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"name":"banner2","imgUrl":"https://testyuna.obs.cn-north-4.myhuaweicloud.com:443/app/manage//bannerad/1589350549161.jpg","url":"http://test.pay.vandyo.com/activity/subscribe ","order":2}]}
接口响应时间:201毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.8' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_flash_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.8')" >
pass</a>
<div id='div_pt1.8' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.8').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.8:
请求地址:http://api-test.vandyo.com/user/flash/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"adverts":null}}
接口响应时间:191毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='ft1.9' class='none'>
<td class='failCase'><div class='testcase'>test_user_car_msg_config_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_ft1.9')" >
fail</a>
<div id='div_ft1.9' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_ft1.9').style.display = 'none' " >
[x]</a>
</div>
<pre>
ft1.9:
请求地址:http://api-test.vandyo.com/user/car_msg/config/get
-------------------------返回结果:-------------------------
{"error":3001,"msg":"该车不属于当前用户","result":null}
Traceback (most recent call last):
File "D:\myProgram\python\interfaceTest\testCase\User_interface_cases.py", line 204, in test_user_car_msg_config_get
self.baseAssert(resObj)
File "D:\myProgram\python\interfaceTest\testCase\User_interface_cases.py", line 278, in baseAssert
self.assertEqual(error, 0, "接口返回错误:" + str(error) + " content: " + resObj.text)
AssertionError: 3001 != 0 : 接口返回错误:3001 content: {"error":3001,"msg":"该车不属于当前用户","result":null}
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.10' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_user_msg_config_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.10')" >
pass</a>
<div id='div_pt1.10' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.10').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.10:
请求地址:http://api-test.vandyo.com/user/user_msg/config/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"total":1,"sys":1}}
接口响应时间:201毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.11' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_config_version_update_get</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.11')" >
pass</a>
<div id='div_pt1.11' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.11').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.11:
请求地址:http://api-test.vandyo.com/user/config/version/update/get
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"version":null,"des":null,"url":null,"update":0,"apkurl":null,"showprompt":null}}
接口响应时间:196毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.12' class='hiddenRow'>
<td class='none'><div class='testcase'>test_user_menu_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.12')" >
pass</a>
<div id='div_pt1.12' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.12').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.12:
请求地址:http://api-test.vandyo.com/user/menu/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"my_menus":[]}}
接口响应时间:223毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr class='passClass'>
<td>testCase.Car_interface_cases.Car_interface_cases</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>0</td>
<td><a href="javascript:showClassDetail('c2',3)">Detail</a></td>
</tr>
<tr id='pt2.1' class='hiddenRow'>
<td class='none'><div class='testcase'>test_car_my_car_list</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt2.1')" >
pass</a>
<div id='div_pt2.1' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt2.1').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt2.1:
请求地址:http://api-test.vandyo.com/car/my_car/list
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"cid":"840ace3de46c44d5b0737941095b1dd8","plate":"渝A12321","nickname":"","din":"M202003060518","bind":"1","typeid":"916","typename":"奥驰T系","modelid":"10002909","modelname":"3.8L 手动 T2 自卸车3.64米 129马力 FD3043P10K4","cbrand":"https://proyuna.obs.cn-north-4.myhuaweicloud.com:443/car/brand/1585202563162.png","addtime":"1589372400"}]}
接口响应时间:229毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt2.2' class='hiddenRow'>
<td class='none'><div class='testcase'>test_car_my_car_info</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt2.2')" >
pass</a>
<div id='div_pt2.2' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt2.2').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt2.2:
请求地址:http://api-test.vandyo.com/car/my_car/info
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":{"cid":"840ace3de46c44d5b0737941095b1dd8","plate":"渝A12321","nickname":"","din":"M202003060518","bind":"1","displacement":"3.8L/T","typeid":"916","typename":"奥驰T系","modelid":"10002909","modelname":"2015款","cbrand":"https://proyuna.obs.cn-north-4.myhuaweicloud.com:443/car/brand/1585202563162.png","gasno":"0","engine":"","vin":"","bxexpiretime":"","insurance":"","bxcity":"","bxlasttime":"","notmodifymile":0,"tipmodifymile":"行驶总里程与仪表盘数据同步,不可修改","mile":"11530","mlast":"","mmile":"","lastmiletime":"","register":"","nsexpiretime":"","nslasttime":"","addtime":"1589372400"}}
接口响应时间:210毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt2.3' class='hiddenRow'>
<td class='none'><div class='testcase'>test_car_my_man_speak</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt2.3')" >
pass</a>
<div id='div_pt2.3' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt2.3').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt2.3: {'cid': '840ace3de46c44d5b0737941095b1dd8', 'message': '车辆位置'}
请求地址:http://api-test.vandyo.com/car/man/speak
-------------------------返回结果:-------------------------
{"error":0,"msg":"成功","result":[{"type":"4","message":"{\"txt\": \"我的【车辆位置】:\\n我在${gps}\",\"spare\":\"我的【车辆位置】:\\n正在定位中\",\"type\": \"car_loc\",\"cnt\":{\"lat\":\"29.612025\",\"lng\":\"106.361245\",\"car_gps\":{\"lat\":\"29.612025\",\"lng\":\"106.361245\"}}}","msgid":"b99c91c666c948debad2ba8e5abbbb9e","mid":"840ace3de46c44d5b0737941095b1dd8","mtype":"2","sendtime":1590137105}]}
接口响应时间:229毫秒
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='total_row'>
<td>Total</td>
<td>15</td>
<td>14</td>
<td>1</td>
<td>0</td>
<td>&nbsp;</td>
</tr>
</table>
<div id='ending'>&nbsp;</div>
</body>
</html>
#coding: utf-8
import time
from testCase.MainCase import MainCase
###########################################################
# 使用html 报告模板输出
###########################################################
def run():
caseObj = MainCase()
caseObj.startTest()
###########################################################
# 只在控制台输出测试结果
###########################################################
def txtRun():
caseObj = MainCase()
caseObj.startTxtTest()
###########################################################
# 通过服务方式启动拨测服务
###########################################################
def runService():
caseObj = MainCase()
ts = time.time()
timeArray = time.localtime(ts)
curTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
caseObj.set_title(curTime + " 拨测报告") # 设置邮件标题
caseObj.set_from_addr("optest@vandyo.com") # 设置发件箱
caseObj.set_password("123qweQWE!@#AaA") # 设置邮箱登录密码
caseObj.add_to_addr("liyuanhong@vandyo.com") # 添加收件箱
# caseObj.add_to_addr("yuzhanyong@vandyo.com") # 添加收件箱
# caseObj.add_to_addr("908963295@qq.com") # 添加收件箱
# caseObj.add_to_cc("jiaxiantao@vandyo.com") # 添加抄送
# caseObj.add_to_cc("langang@vandyo.com") # 添加抄送
caseObj.startTestService()
if __name__ == "__main__":
runService()
# run()
# txtRun()
\ No newline at end of file
#coding: utf-8
'''
汽车接口相关用例
'''
import json
import random
import time
import unittest
import requests
from config import config
from testCase.common import utils
class Car_interface_cases(unittest.TestCase):
##########################################################
# 登录,用户手机密码登录
# 单元测试的同时获取uid 和sid
# 必须是第一个执行的单元测试用例
##########################################################
def test_user_authorize_pwd_login(self):
url = config.HTTP_PREFIX + config.HOST + "/user/authorize/pwd/login"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["ts"] = ts
postData = {}
postData["mobile"] = config.USER_NAME
postData["password"] = utils.getMd5String(config.PASSWORD)
resObj = requests.post(url, headers=headers, params=params, data=json.dumps(postData))
result = json.loads(resObj.text)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
config.SID = result["result"]["sid"]
config.UID = result["result"]["uid"]
self.baseAssert(resObj)
def to_unicode(string):
ret = ''
for v in string:
ret = ret + hex(ord(v)).upper().replace('0X', '\\u')
return ret
##########################################################
# 查询人车对话
##########################################################
def test_car_my_man_speak(self):
url = config.HTTP_PREFIX + config.HOST + "/car/man/speak"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
postData = {}
postData["cid"] = config.CAR_ID
postData["message"] = random.choice(['车辆位置', '即时速度', '发动机转速','剩余油量','电瓶电压'])
cs = utils.getSignature(params,json.dumps(postData))
params["cs"] = cs
params.pop("sid")
print(postData)
resObj = requests.post(url, headers=headers, params=params,data=json.dumps(postData))
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
####################################### 车相关 #######################################
##########################################################
# 车品牌列表
##########################################################
def test_car_my_brand_list(self):
url = config.HTTP_PREFIX + config.HOST + "/car/brand/list"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
result = json.loads(resObj.text)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 车款年款列表
##########################################################
def test_car_model_list_year(self):
# todo
url = config.HTTP_PREFIX + config.HOST + "/car/model/list/year"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
result = json.loads(resObj.text)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 查询车列表
##########################################################
def test_car_my_car_list(self):
url = config.HTTP_PREFIX + config.HOST + "/car/my_car/list"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
result = json.loads(resObj.text)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
config.CAR_ID = result["result"][0]["cid"]
self.baseAssert(resObj)
##########################################################
# 查询车信息
##########################################################
def test_car_my_car_info(self):
url = config.HTTP_PREFIX + config.HOST + "/car/my_car/info"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
params["cid"] = config.CAR_ID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 接口基本断言,需要传入一个返回结果对象
##########################################################
def baseAssert(self,resObj):
statusCode = int(resObj.status_code) # 响应状态码
resTime = int(resObj.elapsed.total_seconds() * 1000) # 获取接口相应时间(毫秒)
result = json.loads(resObj.text)
error = result["error"]
self.assertEqual(statusCode, 200, "响应状态码为:" + str(statusCode))
self.assertTrue(resTime < 4000, "响应时间大于4秒,响应时间为:" + str(resTime) + "毫秒")
self.assertEqual(error, 0, "接口返回错误:" + str(error) + " content: " + resObj.text)
print("接口响应时间:" + str(resTime) + "毫秒")
def startTest(self):
suite = unittest.TestSuite()
suite.addTest(Car_interface_cases("test_user_authorize_pwd_login"))
suite.addTest(Car_interface_cases("test_car_my_brand_list")) # 车品牌列表
suite.addTest(Car_interface_cases("test_car_my_car_list")) # 查询车列表
suite.addTest(Car_interface_cases("test_car_my_car_info")) # 查询车信息
suite.addTest(Car_interface_cases("test_car_my_man_speak")) # 查询人车对话
runner = unittest.TextTestRunner()
runner.run(suite)
if __name__ == "__main__":
Car_interface_cases().startTest()
\ No newline at end of file
#coding: utf-8
'''
测试套件类,用来组织所有的测试用例
'''
import os
import platform
import time
import unittest
from testCase.Car_interface_cases import Car_interface_cases
from testCase.User_interface_cases import User_interface_cases
from testCase.common.EmailTool import EmailTool
from testCase.common.HTMLTestRunner import HTMLTestRunner
class MainCase():
def __init__(self):
self.sucessCount = 0
self.failureCount = 0
self.errorCount = 0
self.testReport = "" #测试报告名
self.testDate = "" #测试日期
self.from_addr = 'optest@vandyo.com' # 发件箱
self.password = '123qweQWE!@#AaA' # 发件箱密码
# self.to_addr = "liyuanhong@vandyo.com" # 收件箱
self.to_addr = "" # 收件箱
self.to_cc = "" # 抄送
self.msg = "邮件内容" # 邮件正文
self.smtp_server = "smtp.exmail.qq.com" # 发信服务器
self.title = "车安优拨测报告" # 邮件标题
def getSucessCount(self):
return self.sucessCount
def getFailCount(self):
return self.failureCount
def getErrorCount(self):
return self.errorCount
def getTestReport(self):
return self.testReport
def getTestDate(self):
return self.testDate
def set_from_addr(self,data):
self.from_addr = data
def set_password(self,data):
self.password = data
def set_to_addr(self,data):
self.to_addr = data
def set_title(self,data):
self.title = data
def set_msg(self,data):
self.msg = data
#########################################################
# 添加收件人
#########################################################
def add_to_addr(self,data):
if self.to_addr == "":
self.to_addr = data
else:
self.to_addr = self.to_addr + "," + data
#########################################################
# 添加抄送
#########################################################
def add_to_cc(self,data):
if self.to_cc == "":
self.to_cc = data
else:
self.to_cc = self.to_cc + "," + data
###########################################################
# 使用html 报告模板输出
###########################################################
def startTest(self):
suite = unittest.TestSuite()
suite.addTest(User_interface_cases("test_user_authorize_pwd_login")) #用户手机密码登录
suite.addTest(User_interface_cases("test_user_mall_goods_list")) #商品列表
suite.addTest(User_interface_cases("test_user_third_party_app_list")) #第三方应用列表
suite.addTest(User_interface_cases("test_user_business_cooperation_get")) #查询商务合作信息
suite.addTest(User_interface_cases("test_user_info_get")) #获取用户基本信息
suite.addTest(User_interface_cases("test_user_pop_list")) #获取弹框广告
suite.addTest(User_interface_cases("test_user_banner_list")) # banner图片列表
suite.addTest(User_interface_cases("test_user_flash_list")) # 获取闪屏广告
suite.addTest(User_interface_cases("test_user_car_msg_config_get")) # 获取车消息开关
suite.addTest(User_interface_cases("test_user_user_msg_config_get")) # 获取用户推送消息开关
suite.addTest(User_interface_cases("test_user_config_version_update_get")) # 版本更新
suite.addTest(User_interface_cases("test_user_menu_list")) #用户菜单列表
suite.addTest(Car_interface_cases("test_car_my_car_list")) #查询车列表
suite.addTest(Car_interface_cases("test_car_my_car_info")) #查询车信息
suite.addTest(Car_interface_cases("test_car_my_man_speak")) #查询人车对话
ts = time.time()
timeArray = time.localtime(ts)
curTime = ""
curDate = ""
sys = platform.system()
if sys == "Windows":
curTime = time.strftime("%Y-%m-%d %H_%M_%S", timeArray)
curDate = time.strftime("%Y-%m-%d", timeArray)
else:
curTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
curDate = time.strftime("%Y-%m-%d", timeArray)
fdir = "result/" + curDate
if not os.path.exists(fdir):
os.mkdir(fdir)
filePath = fdir + "/" + curTime + ".html"
self.testReport = curTime + ".html"
self.testDate = curDate
fp = open(filePath, 'wb')
# 生成报告的Title,描述
runner = HTMLTestRunner(stream=fp, title='车安优App接口测试', description='车安优App拨测程序测试报告...')
result = runner.run(suite)
self.sucessCount = result.success_count
self.failureCount = result.failure_count
self.errorCount = result.error_count
self.msg = "【" + curTime + "】 测试简要结果如下:\n"
self.msg = self.msg + "\n 用例总数:" + str(self.sucessCount + self.failureCount + self.errorCount)
self.msg = self.msg + "\n 成功个数:" + str(self.sucessCount)
self.msg = self.msg + "\n 失败个数:" + str(self.failureCount)
self.msg = self.msg + "\n 错误个数:" + str(self.errorCount)
self.msg = self.msg + "\n\n测试详情,详见附件..."
fp.close()
###########################################################
# 使用html 报告模板输出
###########################################################
def startTxtTest(self):
suite = unittest.TestSuite()
suite.addTest(User_interface_cases("test_user_authorize_pwd_login")) #用户手机密码登录
suite.addTest(User_interface_cases("test_user_mall_goods_list")) #商品列表
suite.addTest(User_interface_cases("test_user_third_party_app_list")) #第三方应用列表
suite.addTest(User_interface_cases("test_user_business_cooperation_get")) #查询商务合作信息
suite.addTest(User_interface_cases("test_user_info_get")) #获取用户基本信息
suite.addTest(User_interface_cases("test_user_pop_list")) #获取弹框广告
suite.addTest(User_interface_cases("test_user_banner_list")) # banner图片列表
suite.addTest(User_interface_cases("test_user_flash_list")) # 获取闪屏广告
suite.addTest(User_interface_cases("test_user_car_msg_config_get")) # 获取车消息开关
suite.addTest(User_interface_cases("test_user_user_msg_config_get")) # 获取用户推送消息开关
suite.addTest(User_interface_cases("test_user_config_version_update_get")) # 版本更新
suite.addTest(User_interface_cases("test_user_menu_list")) #用户菜单列表
suite.addTest(Car_interface_cases("test_car_my_car_list")) # 查询车列表
runner = unittest.TextTestRunner()
runner.run(suite)
###########################################################
# 定时测试服务,如果有失败用例,会自动发送邮件通知
###########################################################
def startTestService(self):
while True:
startTime = int(time.time())
endTime = int(time.time())
self.startTest()
if self.failureCount > 0 or self.errorCount > 0:
self.sendEmail()
###########################################################
# 发送邮件
###########################################################
def sendEmail(self):
email_obj = EmailTool()
email_obj.addContent(self.msg) # 设置邮件内容
email_obj.set_title(self.title) # 设置邮件标题
ts = time.time()
timeArray = time.localtime(ts)
curDate = time.strftime("%Y-%m-%d", timeArray)
time.sleep(2)
email_obj.set_attachment("result/" + curDate + "/" + self.testReport,self.testReport) # 设置附件
email_obj.set_to_addr(self.to_addr) # 设置抄送
email_obj.set_to_cc(self.to_cc) # 设置收信人
email_obj.send()
#coding: utf-8
'''
用户接口相关用例
'''
import json
import time
import unittest
import requests
from config import config
from testCase.common import utils
class User_interface_cases(unittest.TestCase):
##########################################################
# 登录,用户手机密码登录
# 单元测试的同时获取uid 和sid
# 必须是第一个执行的单元测试用例
##########################################################
def test_user_authorize_pwd_login(self):
url = config.HTTP_PREFIX + config.HOST + "/user/authorize/pwd/login"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["ts"] = ts
postData = {}
postData["mobile"] = config.USER_NAME
postData["password"] = utils.getMd5String(config.PASSWORD)
resObj = requests.post(url, headers=headers, params=params, data=json.dumps(postData))
result = json.loads(resObj.text)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
config.SID = result["result"]["sid"]
config.UID = result["result"]["uid"]
self.baseAssert(resObj)
##########################################################
# 商品列表
##########################################################
def test_user_mall_goods_list(self):
url = config.HTTP_PREFIX + config.HOST + "/user/mall/goods/list"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
postData = {}
resObj = requests.post(url, headers=headers, params=params,data=json.dumps(postData))
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 第三方应用列表
##########################################################
def test_user_third_party_app_list(self):
url = config.HTTP_PREFIX + config.HOST + "/user/third/party/app/list"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 查询商务合作信息
##########################################################
def test_user_business_cooperation_get(self):
url = config.HTTP_PREFIX + config.HOST + "/user/business/cooperation/get"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 测试获取用户基本信息
##########################################################
def test_user_info_get(self):
url = config.HTTP_PREFIX + config.HOST + "/user/info/get"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 获取弹框广告
##########################################################
def test_user_pop_list(self):
url = config.HTTP_PREFIX + config.HOST + "/user/pop/list"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
params["psl"] = 1
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# banner图片列表
##########################################################
def test_user_banner_list(self):
url = config.HTTP_PREFIX + config.HOST + "/user/banner/list"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
postData = {}
postData["type"] = 1
temp = dict(params,**postData)
cs = utils.getSignature(temp)
params["cs"] = cs
params.pop("sid")
resObj = requests.post(url, headers=headers, params=params,data=json.dumps(postData))
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 获取闪屏广告
##########################################################
def test_user_flash_list(self):
url = config.HTTP_PREFIX + config.HOST + "/user/flash/list"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 获取车消息开关
##########################################################
def test_user_car_msg_config_get(self):
url = config.HTTP_PREFIX + config.HOST + "/user/car_msg/config/get"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
params["cid"] = config.CAR_ID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 获取用户推送消息开关
##########################################################
def test_user_user_msg_config_get(self):
url = config.HTTP_PREFIX + config.HOST + "/user/user_msg/config/get"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 版本更新
##########################################################
def test_user_config_version_update_get(self):
url = config.HTTP_PREFIX + config.HOST + "/user/config/version/update/get"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["ts"] = ts
params["uid"] = config.UID
params["version"] = "1.1.1"
params["appid"] = "com.vandyo.app.android"
params["os"] = 2
cs = utils.getSignature(params)
params["cs"] = cs
resObj = requests.get(url, headers=headers, params=params)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 用户菜单列表
##########################################################
def test_user_menu_list(self):
url = config.HTTP_PREFIX + config.HOST + "/user/menu/list"
ts = int(time.time())
headers = {"Accept-Encoding": "gzip", "Content-Type": "application/json; charset=UTF-8"}
params = {}
params["sid"] = config.SID
params["ts"] = ts
params["uid"] = config.UID
cs = utils.getSignature(params)
params["cs"] = cs
params.pop("sid")
resObj = requests.get(url, headers=headers, params=params)
print("\n请求地址:" + url)
print("-------------------------返回结果:-------------------------")
print(resObj.text)
self.baseAssert(resObj)
##########################################################
# 接口基本断言,需要传入一个返回结果对象
##########################################################
def baseAssert(self,resObj):
statusCode = int(resObj.status_code) # 响应状态码
resTime = int(resObj.elapsed.total_seconds() * 1000) # 获取接口相应时间(毫秒)
result = json.loads(resObj.text)
error = result["error"]
self.assertEqual(statusCode, 200, "响应状态码为:" + str(statusCode))
self.assertTrue(resTime < 4000, "响应时间大于4秒,响应时间为:" + str(resTime) + "毫秒")
self.assertEqual(error, 0, "接口返回错误:" + str(error) + " content: " + resObj.text)
print("接口响应时间:" + str(resTime) + "毫秒")
def startTest(self):
suite = unittest.TestSuite()
suite.addTest(User_interface_cases("test_user_authorize_pwd_login")) #用户手机密码登录
suite.addTest(User_interface_cases("test_user_mall_goods_list")) #商品列表
suite.addTest(User_interface_cases("test_user_third_party_app_list")) #第三方应用列表
suite.addTest(User_interface_cases("test_user_business_cooperation_get")) #查询商务合作信息
suite.addTest(User_interface_cases("test_user_info_get")) #获取用户基本信息
suite.addTest(User_interface_cases("test_user_pop_list")) #获取弹框广告
suite.addTest(User_interface_cases("test_user_banner_list")) # banner图片列表
suite.addTest(User_interface_cases("test_user_flash_list")) # 获取闪屏广告
suite.addTest(User_interface_cases("test_user_car_msg_config_get")) # 获取车消息开关
suite.addTest(User_interface_cases("test_user_user_msg_config_get")) # 获取用户推送消息开关
suite.addTest(User_interface_cases("test_user_config_version_update_get")) # 版本更新
suite.addTest(User_interface_cases("test_user_menu_list")) #用户菜单列表
runner = unittest.TextTestRunner()
runner.run(suite)
if __name__ == "__main__":
# Login_case().getData()
# Login_case().login()
User_interface_cases().startTest()
\ No newline at end of file
#coding: utf-8
import smtplib
from email import encoders
from email.mime.application import MIMEApplication
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
'''
发送邮件的类
'''
class EmailTool():
def __init__(self):
self.from_addr = 'optest@vandyo.com' # 发件箱
self.password = '123qweQWE!@#AaA' # 发件箱密码
self.to_addr = "liyuanhong@vandyo.com" # 收件箱
self.to_cc = "" # 抄送
self.smtp_server = "smtp.exmail.qq.com" # 发信服务器
self.title = "车安优拨测反馈" # 邮件标题
self.msg_obj = MIMEMultipart("mixed")
def set_from_addr(self,data):
self.from_addr = data
def set_password(self,data):
self.password = data
def set_to_addr(self,data):
self.to_addr = data
def set_to_cc(self,data):
self.to_cc = data
def set_smtp_server(self,data):
self.smtp_server = data
def set_title(self,data):
self.title = data
def set_email_type(self,data):
self.email_type = data
#########################################################
# 添加收件人
#########################################################
def add_to_addr(self,data):
if self.to_addr == "":
self.to_addr = data
else:
self.to_addr = self.to_addr + "," + data
#########################################################
# 添加抄送
#########################################################
def add_to_cc(self,data):
if self.to_cc == "":
self.to_cc = data
else:
self.to_cc = self.to_cc + "," + data
#########################################################
# 添加邮件内容: plain为纯文本,html:为html格式
#########################################################
def addContent(self,msg="",type="plain"):
mime = MIMEText(msg, type, 'utf-8')
self.msg_obj.attach(mime)
#########################################################
# 发送邮件
#########################################################
def send(self):
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
self.msg_obj['From'] = Header(self.from_addr)
self.msg_obj['To'] = Header(self.to_addr) # 收信人
if self.to_cc != "":
self.msg_obj['Cc'] = Header(self.to_cc) # 添加抄送
self.msg_obj['Subject'] = Header(self.title)
server = smtplib.SMTP_SSL(host=self.smtp_server)
server.connect(self.smtp_server, 465)
server.login(self.from_addr, self.password)
if self.to_cc == "":
server.sendmail(self.from_addr, self.to_addr.split(',') ,self.msg_obj.as_string()) # 发送邮件
else:
server.sendmail(self.from_addr, self.to_addr.split(',') + self.to_cc.split(","), self.msg_obj.as_string()) # 发送邮件
server.quit() # 关闭服务器
#########################################################
# 设置附件内容
########################################################
def set_attachment(self,file_path,file_name):
txt = ""
with open(file_path, "r", encoding="utf-8") as fi:
content = fi.read()
txt = content
part = MIMEText(txt, "plain", 'utf-8')
part.add_header('Content-Disposition', 'attachment', filename=file_name)
self.msg_obj.attach(part)
#########################################################
# 读取并返回文件内容
#########################################################
def read_from_file(self,file_name):
txt = ""
with open(file_name, "r", encoding="utf-8") as fi:
content = fi.read()
txt = content
return txt
if __name__ == "__main__":
obj = EmailTool()
obj.set_to_addr("liyuanhong@vandyo.com")
obj.add_to_addr("908963295@qq.com")
obj.add_to_cc("langang@vandyo.com")
obj.addContent("这是一个测试邮件,请忽略...")
obj.set_attachment("../../result/2020-05-22/2020-05-22 13_50_21.html", "2020-05-22 13_50_21.html")
obj.send()
"""
A TestRunner for use with the Python unit testing framework. It
generates a HTML report to show the result at a glance.
The simplest way to use this is to invoke its main method. E.g.
import unittest
import HTMLTestRunner
... define your tests ...
if __name__ == '__main__':
HTMLTestRunner.main()
For more customization options, instantiates a HTMLTestRunner object.
HTMLTestRunner is a counterpart to unittest's TextTestRunner. E.g.
# output to a file
fp = file('my_report.html', 'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream=fp,
title='My unit test',
description='This demonstrates the report output by HTMLTestRunner.'
)
# Use an external stylesheet.
# See the Template_mixin class for more customizable options
runner.STYLESHEET_TMPL = '<link rel="stylesheet" href="my_stylesheet.css" type="text/css">'
# run the test
runner.run(my_test_suite)
------------------------------------------------------------------------
Copyright (c) 2004-2007, Wai Yip Tung
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name Wai Yip Tung nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
"""
# URL: http://tungwaiyip.info/software/HTMLTestRunner.html
__author__ = "Wai Yip Tung"
__version__ = "0.8.2"
"""
Change History
Version 0.8.2
* Show output inline instead of popup window (Viorel Lupu).
Version in 0.8.1
* Validated XHTML (Wolfgang Borgert).
* Added description of test classes and test cases.
Version in 0.8.0
* Define Template_mixin class for customization.
* Workaround a IE 6 bug that it does not treat <script> block as CDATA.
Version in 0.7.1
* Back port to Python 2.3 (Frank Horowitz).
* Fix missing scroll bars in detail log (Podi).
"""
# TODO: color stderr
# TODO: simplify javascript using ,ore than 1 class in the class attribute?
import datetime
import io
import sys
import time
import unittest
from xml.sax import saxutils
# ------------------------------------------------------------------------
# The redirectors below are used to capture output during testing. Output
# sent to sys.stdout and sys.stderr are automatically captured. However
# in some cases sys.stdout is already cached before HTMLTestRunner is
# invoked (e.g. calling logging.basicConfig). In order to capture those
# output, use the redirectors for the cached stream.
#
# e.g.
# >>> logging.basicConfig(stream=HTMLTestRunner.stdout_redirector)
# >>>
class OutputRedirector(object):
""" Wrapper to redirect stdout or stderr """
def __init__(self, fp):
self.fp = fp
def write(self, s):
self.fp.write(s)
def writelines(self, lines):
self.fp.writelines(lines)
def flush(self):
self.fp.flush()
stdout_redirector = OutputRedirector(sys.stdout)
stderr_redirector = OutputRedirector(sys.stderr)
# ----------------------------------------------------------------------
# Template
class Template_mixin(object):
"""
Define a HTML template for report customerization and generation.
Overall structure of an HTML report
HTML
+------------------------+
|<html> |
| <head> |
| |
| STYLESHEET |
| +----------------+ |
| | | |
| +----------------+ |
| |
| </head> |
| |
| <body> |
| |
| HEADING |
| +----------------+ |
| | | |
| +----------------+ |
| |
| REPORT |
| +----------------+ |
| | | |
| +----------------+ |
| |
| ENDING |
| +----------------+ |
| | | |
| +----------------+ |
| |
| </body> |
|</html> |
+------------------------+
"""
STATUS = {
0: 'pass',
1: 'fail',
2: 'error',
}
DEFAULT_TITLE = 'Unit Test Report'
DEFAULT_DESCRIPTION = ''
# ------------------------------------------------------------------------
# HTML Template
HTML_TMPL = r"""<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>%(title)s</title>
<meta name="generator" content="%(generator)s"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
%(stylesheet)s
</head>
<body>
<script language="javascript" type="text/javascript"><!--
output_list = Array();
/* level - 0:Summary; 1:Failed; 2:All */
function showCase(level) {
trs = document.getElementsByTagName("tr");
for (var i = 0; i < trs.length; i++) {
tr = trs[i];
id = tr.id;
if (id.substr(0,2) == 'ft') {
if (level < 1) {
tr.className = 'hiddenRow';
}
else {
tr.className = '';
}
}
if (id.substr(0,2) == 'pt') {
if (level > 1) {
tr.className = '';
}
else {
tr.className = 'hiddenRow';
}
}
}
}
function showClassDetail(cid, count) {
var id_list = Array(count);
var toHide = 1;
for (var i = 0; i < count; i++) {
tid0 = 't' + cid.substr(1) + '.' + (i+1);
tid = 'f' + tid0;
tr = document.getElementById(tid);
if (!tr) {
tid = 'p' + tid0;
tr = document.getElementById(tid);
}
id_list[i] = tid;
if (tr.className) {
toHide = 0;
}
}
for (var i = 0; i < count; i++) {
tid = id_list[i];
if (toHide) {
document.getElementById('div_'+tid).style.display = 'none'
document.getElementById(tid).className = 'hiddenRow';
}
else {
document.getElementById(tid).className = '';
}
}
}
function showTestDetail(div_id){
var details_div = document.getElementById(div_id)
var displayState = details_div.style.display
// alert(displayState)
if (displayState != 'block' ) {
displayState = 'block'
details_div.style.display = 'block'
}
else {
details_div.style.display = 'none'
}
}
function html_escape(s) {
s = s.replace(/&/g,'&amp;');
s = s.replace(/</g,'&lt;');
s = s.replace(/>/g,'&gt;');
return s;
}
/* obsoleted by detail in <div>
function showOutput(id, name) {
var w = window.open("", //url
name,
"resizable,scrollbars,status,width=800,height=450");
d = w.document;
d.write("<pre>");
d.write(html_escape(output_list[id]));
d.write("\n");
d.write("<a href='javascript:window.close()'>close</a>\n");
d.write("</pre>\n");
d.close();
}
*/
--></script>
%(heading)s
%(report)s
%(ending)s
</body>
</html>
"""
# variables: (title, generator, stylesheet, heading, report, ending)
# ------------------------------------------------------------------------
# Stylesheet
#
# alternatively use a <link> for external style sheet, e.g.
# <link rel="stylesheet" href="$url" type="text/css">
STYLESHEET_TMPL = """
<style type="text/css" media="screen">
body { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; }
table { font-size: 100%; }
pre { white-space: pre-wrap; }
/* -- heading ---------------------------------------------------------------------- */
h1 {
font-size: 16pt;
color: gray;
}
.heading {
margin-top: 0ex;
margin-bottom: 1ex;
}
.heading .attribute {
margin-top: 1ex;
margin-bottom: 0;
}
.heading .description {
margin-top: 4ex;
margin-bottom: 6ex;
}
/* -- css div popup ------------------------------------------------------------------------ */
a.popup_link {
}
a.popup_link:hover {
color: red;
}
.popup_window {
display: none;
position: relative;
left: 0px;
top: 0px;
/*border: solid #627173 1px; */
padding: 10px;
background-color: #E6E6D6;
font-family: "Lucida Console", "Courier New", Courier, monospace;
text-align: left;
font-size: 8pt;
width: 500px;
}
}
/* -- report ------------------------------------------------------------------------ */
#show_detail_line {
margin-top: 3ex;
margin-bottom: 1ex;
}
#result_table {
width: 80%;
border-collapse: collapse;
border: 1px solid #777;
}
#header_row {
font-weight: bold;
color: white;
background-color: #777;
}
#result_table td {
border: 1px solid #777;
padding: 2px;
}
#total_row { font-weight: bold; }
.passClass { background-color: #6c6; }
.failClass { background-color: #c60; }
.errorClass { background-color: #c00; }
.passCase { color: #6c6; }
.failCase { color: #c60; font-weight: bold; }
.errorCase { color: #c00; font-weight: bold; }
.hiddenRow { display: none; }
.testcase { margin-left: 2em; }
/* -- ending ---------------------------------------------------------------------- */
#ending {
}
</style>
"""
# ------------------------------------------------------------------------
# Heading
#
HEADING_TMPL = """<div class='heading'>
<h1>%(title)s</h1>
%(parameters)s
<p class='description'>%(description)s</p>
</div>
""" # variables: (title, parameters, description)
HEADING_ATTRIBUTE_TMPL = """<p class='attribute'><strong>%(name)s:</strong> %(value)s</p>
""" # variables: (name, value)
# ------------------------------------------------------------------------
# Report
#
REPORT_TMPL = """
<p id='show_detail_line'>展示
<a href='javascript:showCase(0)'>收起报告</a>
<a href='javascript:showCase(1)'>查看失败</a>
<a href='javascript:showCase(2)'>展开报告</a>
</p>
<table id='result_table'>
<colgroup>
<col align='left' />
<col align='right' />
<col align='right' />
<col align='right' />
<col align='right' />
<col align='right' />
</colgroup>
<tr id='header_row'>
<td>Test Group/Test case</td>
<td>Count</td>
<td>Pass</td>
<td>Fail</td>
<td>Error</td>
<td>View</td>
</tr>
%(test_list)s
<tr id='total_row'>
<td>Total</td>
<td>%(count)s</td>
<td>%(Pass)s</td>
<td>%(fail)s</td>
<td>%(error)s</td>
<td>&nbsp;</td>
</tr>
</table>
""" # variables: (test_list, count, Pass, fail, error)
REPORT_CLASS_TMPL = r"""
<tr class='%(style)s'>
<td>%(desc)s</td>
<td>%(count)s</td>
<td>%(Pass)s</td>
<td>%(fail)s</td>
<td>%(error)s</td>
<td><a href="javascript:showClassDetail('%(cid)s',%(count)s)">Detail</a></td>
</tr>
""" # variables: (style, desc, count, Pass, fail, error, cid)
REPORT_TEST_WITH_OUTPUT_TMPL = r"""
<tr id='%(tid)s' class='%(Class)s'>
<td class='%(style)s'><div class='testcase'>%(desc)s</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_%(tid)s')" >
%(status)s</a>
<div id='div_%(tid)s' class="popup_window">
<div style='text-align: right; color:red;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_%(tid)s').style.display = 'none' " >
[x]</a>
</div>
<pre>
%(script)s
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
""" # variables: (tid, Class, style, desc, status)
REPORT_TEST_NO_OUTPUT_TMPL = r"""
<tr id='%(tid)s' class='%(Class)s'>
<td class='%(style)s'><div class='testcase'>%(desc)s</div></td>
<td colspan='5' align='center'>%(status)s</td>
</tr>
""" # variables: (tid, Class, style, desc, status)
REPORT_TEST_OUTPUT_TMPL = r"""
%(id)s: %(output)s
""" # variables: (id, output)
# ------------------------------------------------------------------------
# ENDING
#
ENDING_TMPL = """<div id='ending'>&nbsp;</div>"""
# -------------------- The end of the Template class -------------------
TestResult = unittest.TestResult
class _TestResult(TestResult):
# note: _TestResult is a pure representation of results.
# It lacks the output and reporting ability compares to unittest._TextTestResult.
def __init__(self, verbosity=1):
TestResult.__init__(self)
self.stdout0 = None
self.stderr0 = None
self.success_count = 0
self.failure_count = 0
self.error_count = 0
self.verbosity = verbosity
# result is a list of result in 4 tuple
# (
# result code (0: success; 1: fail; 2: error),
# TestCase object,
# Test output (byte string),
# stack trace,
# )
self.result = []
# def getSuccess_count(self):
# return self.success_count
#
# def getFailure_count(self):
# return self.failure_count
def startTest(self, test):
TestResult.startTest(self, test)
# just one buffer for both stdout and stderr
self.outputBuffer= io.StringIO()
stdout_redirector.fp = self.outputBuffer
stderr_redirector.fp = self.outputBuffer
self.stdout0 = sys.stdout
self.stderr0 = sys.stderr
sys.stdout = stdout_redirector
sys.stderr = stderr_redirector
def complete_output(self):
"""
Disconnect output redirection and return buffer.
Safe to call multiple times.
"""
if self.stdout0:
sys.stdout = self.stdout0
sys.stderr = self.stderr0
self.stdout0 = None
self.stderr0 = None
return self.outputBuffer.getvalue()
def stopTest(self, test):
# Usually one of addSuccess, addError or addFailure would have been called.
# But there are some path in unittest that would bypass this.
# We must disconnect stdout in stopTest(), which is guaranteed to be called.
self.complete_output()
def addSuccess(self, test):
self.success_count += 1
TestResult.addSuccess(self, test)
output = self.complete_output()
self.result.append((0, test, output, ''))
if self.verbosity > 1:
sys.stderr.write('ok ')
sys.stderr.write(str(test))
sys.stderr.write('\n')
else:
sys.stderr.write('.')
def addError(self, test, err):
self.error_count += 1
TestResult.addError(self, test, err)
_, _exc_str = self.errors[-1]
output = self.complete_output()
self.result.append((2, test, output, _exc_str))
if self.verbosity > 1:
sys.stderr.write('E ')
sys.stderr.write(str(test))
sys.stderr.write('\n')
else:
sys.stderr.write('E')
def addFailure(self, test, err):
self.failure_count += 1
TestResult.addFailure(self, test, err)
_, _exc_str = self.failures[-1]
output = self.complete_output()
self.result.append((1, test, output, _exc_str))
if self.verbosity > 1:
sys.stderr.write('F ')
sys.stderr.write(str(test))
sys.stderr.write('\n')
else:
sys.stderr.write('F')
class HTMLTestRunner(Template_mixin):
"""
"""
def __init__(self, stream=sys.stdout, verbosity=1, title=None, description=None):
self.stream = stream
self.verbosity = verbosity
if title is None:
self.title = self.DEFAULT_TITLE
else:
self.title = title
if description is None:
self.description = self.DEFAULT_DESCRIPTION
else:
self.description = description
self.startTime = datetime.datetime.now()
def run(self, test):
"Run the given test case or test suite."
result = _TestResult(self.verbosity)
test(result)
self.stopTime = datetime.datetime.now()
self.generateReport(test, result)
print(sys.stderr, '\nTimeElapsed: % s' % (self.stopTime - self.startTime))
return result
def sortResult(self, result_list):
# unittest does not seems to run in any particular order.
# Here at least we want to group them together by class.
rmap = {}
classes = []
for n,t,o,e in result_list:
cls = t.__class__
if not cls in rmap:
rmap[cls] = []
classes.append(cls)
rmap[cls].append((n,t,o,e))
r = [(cls, rmap[cls]) for cls in classes]
return r
def getReportAttributes(self, result):
"""
Return report attributes as a list of (name, value).
Override this to add custom attributes.
"""
startTime = str(self.startTime)[:19]
duration = str(self.stopTime - self.startTime)
status = []
if result.success_count: status.append('通过 %s' % result.success_count)
if result.failure_count: status.append('失败 %s' % result.failure_count)
if result.error_count: status.append('错误 %s' % result.error_count )
if status:
status = ' '.join(status)
else:
status = 'none'
return [
('开始测试时间:', startTime),
('测试耗时:', duration),
('状态:', status),
]
def generateReport(self, test, result):
report_attrs = self.getReportAttributes(result)
generator = 'HTMLTestRunner %s' % __version__
stylesheet = self._generate_stylesheet()
heading = self._generate_heading(report_attrs)
report = self._generate_report(result)
ending = self._generate_ending()
output = self.HTML_TMPL % dict(
title = saxutils.escape(self.title),
generator = generator,
stylesheet = stylesheet,
heading = heading,
report = report,
ending = ending,
)
self.stream.write(output.encode('utf8'))
def _generate_stylesheet(self):
return self.STYLESHEET_TMPL
def _generate_heading(self, report_attrs):
a_lines = []
for name, value in report_attrs:
line = self.HEADING_ATTRIBUTE_TMPL % dict(
name = saxutils.escape(name),
value = saxutils.escape(value),
)
a_lines.append(line)
heading = self.HEADING_TMPL % dict(
title = saxutils.escape(self.title),
parameters = ''.join(a_lines),
description = saxutils.escape(self.description),
)
return heading
def _generate_report(self, result):
rows = []
sortedResult = self.sortResult(result.result)
for cid, (cls, cls_results) in enumerate(sortedResult):
# subtotal for a class
np = nf = ne = 0
for n,t,o,e in cls_results:
if n == 0: np += 1
elif n == 1: nf += 1
else: ne += 1
# format class description
if cls.__module__ == "__main__":
name = cls.__name__
else:
name = "%s.%s" % (cls.__module__, cls.__name__)
doc = cls.__doc__ and cls.__doc__.split("\n")[0] or ""
desc = doc and '%s: %s' % (name, doc) or name
row = self.REPORT_CLASS_TMPL % dict(
style = ne > 0 and 'errorClass' or nf > 0 and 'failClass' or 'passClass',
desc = desc,
count = np+nf+ne,
Pass = np,
fail = nf,
error = ne,
cid = 'c%s' % (cid+1),
)
rows.append(row)
for tid, (n,t,o,e) in enumerate(cls_results):
self._generate_report_test(rows, cid, tid, n, t, o, e)
report = self.REPORT_TMPL % dict(
test_list = ''.join(rows),
count = str(result.success_count+result.failure_count+result.error_count),
Pass = str(result.success_count),
fail = str(result.failure_count),
error = str(result.error_count),
)
return report
def _generate_report_test(self, rows, cid, tid, n, t, o, e):
# e.g. 'pt1.1', 'ft1.1', etc
has_output = bool(o or e)
tid = (n == 0 and 'p' or 'f') + 't%s.%s' % (cid+1,tid+1)
name = t.id().split('.')[-1]
doc = t.shortDescription() or ""
desc = doc and ('%s: %s' % (name, doc)) or name
tmpl = has_output and self.REPORT_TEST_WITH_OUTPUT_TMPL or self.REPORT_TEST_NO_OUTPUT_TMPL
''' # o and e should be byte string because they are collected from stdout and stderr?
if isinstance(o,str):
# TODO: some problem with 'string_escape': it escape \n and mess up formating
# uo = unicode(o.encode('string_escape'))
uo = e
else:
uo = o
'''
uo = o
if isinstance(e,str):
# TODO: some problem with 'string_escape': it escape \n and mess up formating
# ue = unicode(e.encode('string_escape'))
ue = e
else:
ue = e
script = self.REPORT_TEST_OUTPUT_TMPL % dict(
id = tid,
output = saxutils.escape(uo+ue),
)
row = tmpl % dict(
tid = tid,
Class = (n == 0 and 'hiddenRow' or 'none'),
style = n == 2 and 'errorCase' or (n == 1 and 'failCase' or 'none'),
desc = desc,
script = script,
status = self.STATUS[n],
)
rows.append(row)
if not has_output:
return
def _generate_ending(self):
return self.ENDING_TMPL
##############################################################################
# Facilities for running tests from the command line
##############################################################################
# Note: Reuse unittest.TestProgram to launch test. In the future we may
# build our own launcher to support more specific command line
# parameters like test title, CSS, etc.
class TestProgram(unittest.TestProgram):
"""
A variation of the unittest.TestProgram. Please refer to the base
class for command line parameters.
"""
def runTests(self):
# Pick HTMLTestRunner as the default test runner.
# base class's testRunner parameter is not useful because it means
# we have to instantiate HTMLTestRunner before we know self.verbosity.
if self.testRunner is None:
self.testRunner = HTMLTestRunner(verbosity=self.verbosity)
unittest.TestProgram.runTests(self)
main = TestProgram
##############################################################################
# Executing this module from the command line
##############################################################################
if __name__ == "__main__":
main(module=None)
# coding:utf-8
'''
在此定义辅助函数
'''
import hashlib
#################################################
# 获取一个Md5的字符串
#################################################
def getMd5String(data):
m = hashlib.md5()
b = data.encode(encoding='utf-8')
m.update(b)
str_md5 = m.hexdigest()
return str_md5
#################################################
# 获取签名,传入一个map,
# (需要对传入的参数,按照key的升序排列)
#################################################
def getSignature(data,postData={}):
sMd5 = ""
if len(postData) == 0:
key = sorted(data.keys())
tem = {}
for item in key:
tem[item] = data[item]
data = tem
s = ""
for key in data.keys():
s = s + key + "[" + str(data[key]) + "];"
sMd5 = getMd5String(s)
else:
data["Data"] = postData
key = sorted(data.keys())
tem = {}
for item in key:
tem[item] = data[item]
data = tem
s = ""
for key in data.keys():
s = s + key + "[" + str(data[key]) + "];"
sMd5 = getMd5String(s)
return sMd5
if __name__ == "__main__":
print(getSignature({"a":123,"b":"abc"}))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment