- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python http接口自动化测试框架实现方法示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了python http接口自动化测试框架实现方法。分享给大家供大家参考,具体如下:
1、测试需求描述 。
对服务后台一系列的http接口功能测试.
输入:根据接口描述构造不同的参数输入值 。
输出:xml文件 。
eg:http://xxx.com/xxx_product/test/content_book_list.jsp?listid=1 。
2、实现方法 。
1、选用python脚本来驱动测试 。
2、采用excel表格管理测试数据,包括用例的管理、测试数据录入、测试结果显示等等,这个需要封装一个excel的类即可.
3、调用http接口采用python封装好的api即可 。
4、测试需要的http组装字符转处理即可 。
5、设置2个检查点,xml文件中的返回值字段(通过解析xml得到);xml文件的正确性(文件对比) 。
6、首次执行测试采用半自动化的方式,即人工检查输出的xml文件是否正确,一旦正确将封存xml文件,为后续回归测试的预期结果,如果发现错误手工修正为预期文件。(注意不是每次测试都人工检查该文件,只首次测试的时候才检查) 。
3、excel表格样式 。
4、实现代码(代码才是王道,有注释很容易就能看明白的) 。
1、测试框架代码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
|
#****************************************************************
# testframe.py
# author : vince
# version : 1.1.2
# date : 2011-3-14
# description: 自动化测试平台
#****************************************************************
import
os,sys, urllib, httplib, profile, datetime, time
from
xml2dict
import
xml2dict
import
win32com.client
from
win32com.client
import
dispatch
import
xml.etree.elementtree as et
#import mysqldb
#excel表格中测试结果底色
ok_color
=
0xffffff
ng_color
=
0xff
#nt_color=0xffff
nt_color
=
0xc0c0c0
#excel表格中测试结果汇总显示位置
testtime
=
[
1
,
14
]
testresult
=
[
2
,
14
]
#excel模版设置
#self.titleindex=3 #excel中测试用例标题行索引
#self.casebegin =4 #excel中测试用例开始行索引
#self.argbegin =3 #excel中参数开始列索引
#self.argcount =8 #excel中支持的参数个数
class
create_excel:
def
__init__(
self
, sfile, dtitleindex
=
3
, dcasebegin
=
4
, dargbegin
=
3
, dargcount
=
8
):
self
.xlapp
=
win32com.client.dispatch(
'et.application'
)
#ms:excel wps:et
try
:
self
.book
=
self
.xlapp.workbooks.
open
(sfile)
except
:
print_error_info()
print
"打开文件失败"
exit()
self
.
file
=
sfile
self
.titleindex
=
dtitleindex
self
.casebegin
=
dcasebegin
self
.argbegin
=
dargbegin
self
.argcount
=
dargcount
self
.allresult
=
[]
self
.retcol
=
self
.argbegin
+
self
.argcount
self
.xmlcol
=
self
.retcol
+
1
self
.resultcol
=
self
.xmlcol
+
1
def
close(
self
):
#self.book.close(savechanges=0)
self
.book.save()
self
.book.close()
#self.xlapp.quit()
del
self
.xlapp
def
read_data(
self
, isheet, irow, icol):
try
:
sht
=
self
.book.worksheets(isheet)
svalue
=
str
(sht.cells(irow, icol).value)
except
:
self
.close()
print
(
'读取数据失败'
)
exit()
#去除'.0'
if
svalue[
-
2
:]
=
=
'.0'
:
svalue
=
svalue[
0
:
-
2
]
return
svalue
def
write_data(
self
, isheet, irow, icol, sdata, color
=
ok_color):
try
:
sht
=
self
.book.worksheets(isheet)
sht.cells(irow, icol).value
=
sdata.decode(
"utf-8"
)
sht.cells(irow, icol).interior.color
=
color
self
.book.save()
except
:
self
.close()
print
(
'写入数据失败'
)
exit()
#获取用例个数
def
get_ncase(
self
, isheet):
try
:
return
self
.get_nrows(isheet)
-
self
.casebegin
+
1
except
:
self
.close()
print
(
'获取case个数失败'
)
exit()
def
get_nrows(
self
, isheet):
try
:
sht
=
self
.book.worksheets(isheet)
return
sht.usedrange.rows.count
except
:
self
.close()
print
(
'获取nrows失败'
)
exit()
def
get_ncols(
self
, isheet):
try
:
sht
=
self
.book.worksheets(isheet)
return
sht.usedrange.columns.count
except
:
self
.close()
print
(
'获取ncols失败'
)
exit()
def
del_testrecord(
self
, suiteid):
try
:
#为提升性能特别从for循环提取出来
nrows
=
self
.get_nrows(suiteid)
+
1
ncols
=
self
.get_ncols(suiteid)
+
1
begincol
=
self
.argbegin
+
self
.argcount
#提升性能
sht
=
self
.book.worksheets(suiteid)
for
row
in
range
(
self
.casebegin, nrows):
for
col
in
range
(begincol, ncols):
str
=
self
.read_data(suiteid, row, col)
#清除实际结果[]
startpos
=
str
.find(
'['
)
if
startpos>
0
:
str
=
str
[
0
:startpos].strip()
self
.write_data(suiteid, row, col,
str
, ok_color)
else
:
#提升性能
sht.cells(row, col).interior.color
=
ok_color
#清除testresul列中的测试结果,设置为nt
self
.write_data(suiteid, row,
self
.argbegin
+
self
.argcount
+
1
,
' '
, ok_color)
self
.write_data(suiteid, row,
self
.resultcol,
'nt'
, nt_color)
except
:
self
.close()
print
(
'清除数据失败'
)
exit()
#执行调用
def
httpinvoke(ipport, url):
conn
=
httplib.httpconnection(ipport)
conn.request(
"get"
, url)
rsps
=
conn.getresponse()
data
=
rsps.read()
conn.close()
return
data
#获取用例基本信息[interface,argcount,[argnamelist]]
def
get_caseinfo(data, suiteid):
caseinfolist
=
[]
sinterface
=
data.read_data(suiteid,
1
,
2
)
argcount
=
int
(data.read_data(suiteid,
2
,
2
))
#获取参数名存入argnamelist
argnamelist
=
[]
for
i
in
range
(
0
, argcount):
argnamelist.append(data.read_data(suiteid, data.titleindex, data.argbegin
+
i))
caseinfolist.append(sinterface)
caseinfolist.append(argcount)
caseinfolist.append(argnamelist)
return
caseinfolist
#获取输入
def
get_input(data, suiteid, caseid, caseinfolist):
sarge
=
''
#参数组合
for
j
in
range
(
0
, caseinfolist[
1
]):
if
data.read_data(suiteid, data.casebegin
+
caseid, data.argbegin
+
j) !
=
"none"
:
sarge
=
sarge
+
caseinfolist[
2
][j]
+
'='
+
data.read_data(suiteid, data.casebegin
+
caseid, data.argbegin
+
j)
+
'&'
#去掉结尾的&字符
if
sarge[
-
1
:]
=
=
'&'
:
sarge
=
sarge[
0
:
-
1
]
sinput
=
caseinfolist[
0
]
+
sarge
#组合全部参数
return
sinput
#结果判断
def
assert_result(sreal, sexpect):
sreal
=
str
(sreal)
sexpect
=
str
(sexpect)
if
sreal
=
=
sexpect:
return
'ok'
else
:
return
'ng'
#将测试结果写入文件
def
write_result(data, suiteid, caseid, resultcol,
*
result):
if
len
(result)>
1
:
ret
=
'ok'
for
i
in
range
(
0
,
len
(result)):
if
result[i]
=
=
'ng'
:
ret
=
'ng'
break
if
ret
=
=
'ng'
:
data.write_data(suiteid, data.casebegin
+
caseid, resultcol,ret, ng_color)
else
:
data.write_data(suiteid, data.casebegin
+
caseid, resultcol,ret, ok_color)
data.allresult.append(ret)
else
:
if
result[
0
]
=
=
'ng'
:
data.write_data(suiteid, data.casebegin
+
caseid, resultcol,result[
0
], ng_color)
elif
result[
0
]
=
=
'ok'
:
data.write_data(suiteid, data.casebegin
+
caseid, resultcol,result[
0
], ok_color)
else
:
#nt
data.write_data(suiteid, data.casebegin
+
caseid, resultcol,result[
0
], nt_color)
data.allresult.append(result[
0
])
#将当前结果立即打印
print
'case'
+
str
(caseid
+
1
)
+
':'
, data.allresult[
-
1
]
#打印测试结果
def
statisticresult(excelobj):
allresultlist
=
excelobj.allresult
count
=
[
0
,
0
,
0
]
for
i
in
range
(
0
,
len
(allresultlist)):
#print 'case'+str(i+1)+':', allresultlist[i]
count
=
countflag(allresultlist[i],count[
0
], count[
1
], count[
2
])
print
'statistic result as follow:'
print
'ok:'
, count[
0
]
print
'ng:'
, count[
1
]
print
'nt:'
, count[
2
]
#解析xmlstring返回dict
def
get_xmlstring_dict(xml_string):
xml
=
xml2dict()
return
xml.fromstring(xml_string)
#解析xmlfile返回dict
def
get_xmlfile_dict(xml_file):
xml
=
xml2dict()
return
xml.parse(xml_file)
#去除历史数据expect[real]
def
delcomment(excelobj, suiteid, irow, icol,
str
):
startpos
=
str
.find(
'['
)
if
startpos>
0
:
str
=
str
[
0
:startpos].strip()
excelobj.write_data(suiteid, irow, icol,
str
, ok_color)
return
str
#检查每个item (非结构体)
def
check_item(excelobj, suiteid, caseid,real_dict, checklist, begincol):
ret
=
'ok'
for
checkid
in
range
(
0
,
len
(checklist)):
real
=
real_dict[checklist[checkid]][
'value'
]
expect
=
excelobj.read_data(suiteid, excelobj.casebegin
+
caseid, begincol
+
checkid)
#如果检查不一致测将实际结果写入expect字段,格式:expect[real]
#将return ng
result
=
assert_result(real, expect)
if
result
=
=
'ng'
:
writestr
=
expect
+
'['
+
real
+
']'
excelobj.write_data(suiteid, excelobj.casebegin
+
caseid, begincol
+
checkid, writestr, ng_color)
ret
=
'ng'
return
ret
#检查结构体类型
def
check_struct_item(excelobj, suiteid, caseid,real_struct_dict, structlist, structbegin, structcount):
ret
=
'ok'
if
structcount>
1
:
#传入的是list
for
structid
in
range
(
0
, structcount):
structdict
=
real_struct_dict[structid]
temp
=
check_item(excelobj, suiteid, caseid,structdict, structlist, structbegin
+
structid
*
len
(structlist))
if
temp
=
=
'ng'
:
ret
=
'ng'
else
:
#传入的是dict
temp
=
check_item(excelobj, suiteid, caseid,real_struct_dict, structlist, structbegin)
if
temp
=
=
'ng'
:
ret
=
'ng'
return
ret
#获取异常函数及行号
def
print_error_info():
"""return the frame object for the caller's stack frame."""
try
:
raise
exception
except
:
f
=
sys.exc_info()[
2
].tb_frame.f_back
print
(f.f_code.co_name, f.f_lineno)
#测试结果计数器,类似switch语句实现
def
countflag(flag,ok, ng, nt):
calculation
=
{
'ok'
:
lambda
:[ok
+
1
, ng, nt],
'ng'
:
lambda
:[ok, ng
+
1
, nt],
'nt'
:
lambda
:[ok, ng, nt
+
1
]}
return
calculation[flag]()
|
2、项目测试代码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
# -*- coding: utf-8 -*-
#****************************************************************
# xxx_server_case.py
# author : vince
# version : 1.0
# date : 2011-3-10
# description: 内容服务系统测试代码
#****************************************************************
from
testframe
import
*
from
common_lib
import
*
httpstring
=
'http://xxx.com/xxx_product/test/'
expectxmldir
=
os.getcwd()
+
'/testdir/expect/'
realxmldir
=
os.getcwd()
+
'/testdir/real/'
def
run(interface_name, suiteid):
print
'【'
+
interface_name
+
'】'
+
' test begin,please waiting...'
global
expectxmldir, realxmldir
#根据接口名分别创建预期结果目录和实际结果目录
expectdir
=
expectxmldir
+
interface_name
realdir
=
realxmldir
+
interface_name
if
os.path.exists(expectdir)
=
=
0
:
os.makedirs(expectdir)
if
os.path.exists(realdir)
=
=
0
:
os.makedirs(realdir)
excelobj.del_testrecord(suiteid)
#清除历史测试数据
casecount
=
excelobj.get_ncase(suiteid)
#获取case个数
caseinfolist
=
get_caseinfo(excelobj, suiteid)
#获取case基本信息
#遍历执行case
for
caseid
in
range
(
0
, casecount):
#检查是否执行该case
if
excelobj.read_data(suiteid,excelobj.casebegin
+
caseid,
2
)
=
=
'n'
:
write_result(excelobj, suiteid, caseid, excelobj.resultcol,
'nt'
)
continue
#当前case结束,继续执行下一个case
#获取测试数据
sinput
=
httpstring
+
get_input(excelobj, suiteid, caseid, caseinfolist)
xmlstring
=
httpinvoke(com_ipport, sinput)
#执行调用
#获取返回码并比较
result_code
=
et.fromstring(xmlstring).find(
"result_code"
).text
ret1
=
check_result(excelobj, suiteid, caseid,result_code, excelobj.retcol)
#保存预期结果文件
expectpath
=
expectdir
+
'/'
+
str
(caseid
+
1
)
+
'.xml'
#savexmlfile(expectpath, xmlstring)
#保存实际结果文件
realpath
=
realdir
+
'/'
+
str
(caseid
+
1
)
+
'.xml'
savexmlfile(realpath, xmlstring)
#比较预期结果和实际结果
ret2
=
check_xmlfile(excelobj, suiteid, caseid,expectpath, realpath)
#写测试结果
write_result(excelobj, suiteid, caseid, excelobj.resultcol, ret1, ret2)
print
'【'
+
interface_name
+
'】'
+
' test end!'
|
3、测试入口 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# -*- coding: utf-8 -*-
#****************************************************************
# main.py
# author : vince
# version : 1.0
# date : 2011-3-16
# description: 测试组装,用例执行入口
#****************************************************************
from
testframe
import
*
from
xxx_server_case
import
*
import
xxx_server_case
#产品系统接口测试
#设置测试环境
xxx_server_case.excelobj
=
create_excel(os.getcwd()
+
'/testdir/xxx_testcase.xls'
)
xxx_server_case.com_ipport
=
xxx.com'
#add testsuite begin
run(
"xxx_book_list"
,
4
)
#add other suite from here
#add testsuite end
statisticresult(xxx_server_case.excelobj)
xxx_server_case.excelobj.close()
|
希望本文所述对大家python程序设计有所帮助.
原文链接:https://blog.csdn.net/qq_24373725/article/details/77992656 。
最后此篇关于Python http接口自动化测试框架实现方法示例的文章就讲到这里了,如果你想了解更多关于Python http接口自动化测试框架实现方法示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我获得了一些源代码示例,我想测试一些功能。不幸的是,我在执行程序时遇到问题: 11:41:31 [linqus@ottsrvafq1 example]$ javac -g test/test.jav
我想测试ggplot生成的两个图是否相同。一种选择是在绘图对象上使用all.equal,但我宁愿进行更艰巨的测试以确保它们相同,这似乎是identical()为我提供的东西。 但是,当我测试使用相同d
我确实使用 JUnit5 执行我的 Maven 测试,其中所有测试类都有 @ExtendWith({ProcessExtension.class}) 注释。如果是这种情况,此扩展必须根据特殊逻辑使测试
在开始使用 Node.js 开发有用的东西之前,您的流程是什么?您是否在 VowJS、Expresso 上创建测试?你使用 Selenium 测试吗?什么时候? 我有兴趣获得一个很好的工作流程来开发我
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 3 年前。 基于示例here ,我尝试为我的
我正在考虑测试一些 Vue.js 组件,作为 Laravel 应用程序的一部分。所以,我有一个在 Blade 模板中使用并生成 GET 的组件。在 mounted 期间请求生命周期钩子(Hook)。假
考虑以下程序: #include struct Test { int a; }; int main() { Test t=Test(); std::cout<
我目前的立场是:如果我使用 web 测试(在我的例子中可能是通过 VS.NET'08 测试工具和 WatiN)以及代码覆盖率和广泛的数据来彻底测试我的 ASP.NET 应用程序,我应该不需要编写单独的
我正在使用 C#、.NET 4.7 我有 3 个字符串,即。 [test.1, test.10, test.2] 我需要对它们进行排序以获得: test.1 test.2 test.10 我可能会得到
我有一个 ID 为“rv_list”的 RecyclerView。单击任何 RecyclerView 项目时,每个项目内都有一个可见的 id 为“star”的 View 。 我想用 expresso
我正在使用 Jest 和模拟器测试 Firebase 函数,尽管这些测试可能来自竞争条件。所谓 flakey,我的意思是有时它们会通过,有时不会,即使在同一台机器上也是如此。 测试和函数是用 Type
我在测试我与 typeahead.js ( https://github.com/angular-ui/bootstrap/blob/master/src/typeahead/typeahead.js
我正在尝试使用 Teamcity 自动运行测试,但似乎当代理编译项目时,它没有正确完成,因为当我运行运行测试之类的命令时,我收到以下错误: fatal error: 'Pushwoosh/PushNo
这是我第一次玩 cucumber ,还创建了一个测试和 API 的套件。我的问题是在测试 API 时是否需要运行它? 例如我脑子里有这个, 启动 express 服务器作为后台任务 然后当它启动时(我
我有我的主要应用程序项目,然后是我的测试的第二个项目。将所有类型的测试存储在该测试项目中是一种好的做法,还是应该将一些测试驻留在主应用程序项目中? 我应该在我的主项目中保留 POJO JUnit(测试
我正在努力弄清楚如何实现这个计数。模型是用户、测试、等级 用户 has_many 测试,测试 has_many 成绩。 每个等级都有一个计算分数(strong_pass、pass、fail、stron
我正在尝试测试一些涉及 OkHttp3 的下载代码,但不幸失败了。目标:测试 下载图像文件并验证其是否有效。平台:安卓。此代码可在生产环境中运行,但测试代码没有任何意义。 产品代码 class Fil
当我想为 iOS 运行 UI 测试时,我收到以下消息: SetUp : System.Exception : Unable to determine simulator version for X 堆
我正在使用 Firebase Remote Config 在 iOS 上设置 A/B 测试。 一切都已设置完毕,我正在 iOS 应用程序中读取服务器端默认值。 但是在多个模拟器上尝试,它们都读取了默认
[已编辑]:我已经用 promise 方式更改了我的代码。 我正在写 React with this starter 由 facebook 创建,我是测试方面的新手。 现在我有一个关于图像的组件,它有
我是一名优秀的程序员,十分优秀!