├── .gitignore
├── .idea
├── .name
├── auto_http34_test.iml
├── encodings.xml
├── inspectionProfiles
│ └── Project_Default.xml
├── misc.xml
├── modules.xml
├── scopes
│ └── scope_settings.xml
├── vcs.xml
└── workspace.xml
├── Base
├── BaseElementEnmu.py
├── BaseEmail.py
├── BaseExcel.py
├── BaseFile.py
├── BaseGetExcel.py
├── BaseIni.py
├── BaseInit.py
├── BaseParams.py
├── BaseReq.py
├── BaseReq1.py
├── BaseRunner.py
├── BaseRunner1.py
├── BaseStatistics.py
├── __init__.py
└── __pycache__
│ ├── BaseElementEnmu.cpython-34.pyc
│ ├── BaseElementEnmu.cpython-36.pyc
│ ├── BaseExcel.cpython-34.pyc
│ ├── BaseExcel.cpython-36.pyc
│ ├── BaseFile.cpython-34.pyc
│ ├── BaseFile.cpython-36.pyc
│ ├── BaseGetExcel.cpython-34.pyc
│ ├── BaseGetExcel.cpython-36.pyc
│ ├── BaseIni.cpython-34.pyc
│ ├── BaseIni.cpython-36.pyc
│ ├── BaseInit.cpython-34.pyc
│ ├── BaseInit.cpython-36.pyc
│ ├── BaseParams.cpython-34.pyc
│ ├── BaseParams.cpython-36.pyc
│ ├── BaseReq.cpython-34.pyc
│ ├── BaseReq.cpython-36.pyc
│ ├── BaseReq1.cpython-36.pyc
│ ├── BaseRunner.cpython-34.pyc
│ ├── BaseRunner.cpython-36.pyc
│ ├── BaseRunner1.cpython-36.pyc
│ ├── BaseStatistics.cpython-34.pyc
│ ├── BaseStatistics.cpython-36.pyc
│ ├── __init__.cpython-34.pyc
│ └── __init__.cpython-36.pyc
├── Log
├── info.pickle
├── param.txt
└── param_result.txt
├── README.md
├── Report
├── Report.xlsx
└── api.xlsx
├── Runner
├── __init__.py
├── runner.py
├── runner1.py
└── start_test.bat
├── Setting
└── Config.ini
├── TestCases
├── Api.py
├── Api1.py
├── __init__.py
└── __pycache__
│ ├── Api.cpython-34.pyc
│ ├── Api.cpython-36.pyc
│ ├── Api1.cpython-36.pyc
│ ├── __init__.cpython-34.pyc
│ └── __init__.cpython-36.pyc
├── channel_log.md
├── img
├── api.jpg
├── no_pict.jpg
└── pict.jpg
└── requirements.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------
1 | auto_http34_test
--------------------------------------------------------------------------------
/.idea/auto_http34_test.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/scopes/scope_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
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 | true
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 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 | 1438258592767
313 |
314 |
315 | 1438258592767
316 |
317 |
318 |
319 |
320 |
321 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
--------------------------------------------------------------------------------
/Base/BaseElementEnmu.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | PATH = lambda p: os.path.abspath(
4 | os.path.join(os.path.dirname(__file__), p)
5 | )
6 |
7 |
8 | class Element(object):
9 | INFO_FILE = PATH("../Log/info.pickle") # 记录结果
10 | REPORT_FILE = PATH("../Report/Report.xlsx") # 测试报告
11 | API_FILE = PATH("../Report/api.xlsx") # 用例文件
12 | PICT_PARAM = PATH("../Log/param.txt") # 写入pict需要的参数
13 | PICT_PARAM_RESULT = PATH("../Log/param_result.txt") # pict生成后的数据
14 | OPEN_PICT = PATH("../Setting/Config.ini") # 打开pict配置器
15 |
16 | ERROR_EMPTY = "error_empty"
17 | ERROR_VALUE = "error_value"
--------------------------------------------------------------------------------
/Base/BaseEmail.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from email.header import Header
3 | from email.mime.text import MIMEText
4 | from email.utils import parseaddr, formataddr
5 | from email.mime.multipart import MIMEMultipart
6 | from email.mime.application import MIMEApplication
7 | import smtplib
8 | import os
9 | PATH = lambda p: os.path.abspath(
10 | os.path.join(os.path.dirname(__file__), p)
11 | )
12 | def _format_addr(s):
13 | name, addr = parseaddr(s)
14 | return formataddr((Header(name, 'utf-8').encode(), addr))
15 | def send_mail(**kwargs):
16 | '''
17 | :param f: 附件路径
18 | :param to_addr:发给的人 []
19 | :return:
20 | '''
21 | from_addr = kwargs["mail_user"]
22 | password = kwargs["mail_pass"]
23 | # to_addr = "ashikun@126.com"
24 | smtp_server = kwargs["mail_host"]
25 |
26 | msg = MIMEMultipart()
27 |
28 | # msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
29 | msg['From'] = _format_addr('来自<%s>接口测试' % from_addr)
30 | msg['To'] = _format_addr(' <%s>' % kwargs["to_addr"])
31 | msg['Subject'] = Header(kwargs["header_msg"], 'utf-8').encode()
32 | msg.attach(MIMEText(kwargs["attach"], 'plain', 'utf-8'))
33 |
34 | if kwargs.get("report", "0") != "0":
35 | part = MIMEApplication(open(kwargs["report"], 'rb').read())
36 | part.add_header('Content-Disposition', 'attachment', filename=('gb2312', '', kwargs["report_name"]))
37 | msg.attach(part)
38 |
39 | server = smtplib.SMTP_SSL(smtp_server, kwargs["port"])
40 | server.set_debuglevel(1)
41 | server.login(from_addr, password)
42 | server.sendmail(from_addr, kwargs["to_addr"], msg.as_string())
43 | server.quit()
44 | if __name__ == '__main__':
45 | to_addr = ["284772894@qq.com"]
46 | mail_host = "smtp.qq.com"
47 | mail_user = "284772894@qq.com"
48 | mail_pass = "oftllbhnknegbjhb"
49 | port = "465"
50 | header_msg = "接口测试"
51 | attach = "接口测试"
52 | report = PATH("../Log/report.xlsx")
53 | send_mail(to_addr = to_addr, mail_host = mail_host, mail_user=mail_user, port=port, mail_pass=mail_pass, header_msg=header_msg, report=report, attach=attach, report_name="接口测试报告")
54 |
--------------------------------------------------------------------------------
/Base/BaseExcel.py:
--------------------------------------------------------------------------------
1 | __author__ = 'shikun'
2 | import xlsxwriter
3 | import os
4 |
5 | PATH = lambda p: os.path.abspath(
6 | os.path.join(os.path.dirname(__file__), p)
7 | )
8 |
9 |
10 | class OperateReport:
11 | def __init__(self, wd):
12 | self.wd = wd
13 |
14 | def detail(self, worksheet, info):
15 | # 设置列行的宽高
16 | worksheet.set_column("A:A", 30)
17 | worksheet.set_column("B:B", 20)
18 | worksheet.set_column("C:C", 20)
19 | worksheet.set_column("D:D", 20)
20 | worksheet.set_column("E:E", 20)
21 | worksheet.set_column("F:F", 20)
22 | worksheet.set_column("G:G", 20)
23 | worksheet.set_column("H:H", 20)
24 |
25 | worksheet.set_row(1, 30)
26 | worksheet.set_row(2, 30)
27 | worksheet.set_row(3, 30)
28 | worksheet.set_row(4, 30)
29 | worksheet.set_row(5, 30)
30 | worksheet.set_row(6, 30)
31 | worksheet.set_row(7, 30)
32 | worksheet.set_row(8, 30)
33 |
34 | worksheet.merge_range('A1:H1', '测试详情', get_format(self.wd, {'bold': True, 'font_size': 18, 'align': 'center',
35 | 'valign': 'vcenter', 'bg_color': 'blue',
36 | 'font_color': '#ffffff'}))
37 | _write_center(worksheet, "A2", '请求', self.wd)
38 | _write_center(worksheet, "B2", '方法', self.wd)
39 | _write_center(worksheet, "C2", '请求参数', self.wd)
40 | _write_center(worksheet, "D2", '请求说明', self.wd)
41 | _write_center(worksheet, "E2", '期望值', self.wd)
42 | _write_center(worksheet, "F2", '响应码 ', self.wd)
43 | _write_center(worksheet, "G2", '实际结果 ', self.wd)
44 | _write_center(worksheet, "H2", '是否通过 ', self.wd)
45 |
46 | temp = 3
47 | for item in info:
48 | # print(item)
49 | _write_center(worksheet, "A" + str(temp), item["url"], self.wd)
50 | _write_center(worksheet, "B" + str(temp), item["method"], self.wd)
51 | _write_center(worksheet, "C" + str(temp), item["params"], self.wd)
52 | _write_center(worksheet, "D" + str(temp), item["msg"], self.wd)
53 | _write_center(worksheet, "E" + str(temp), item["hope"], self.wd)
54 | _write_center(worksheet, "F" + str(temp), item["code"], self.wd)
55 | _write_center(worksheet, "G" + str(temp), item["res"], self.wd)
56 | _write_center(worksheet, "H" + str(temp), item["result"], self.wd)
57 |
58 | temp += 1
59 |
60 | def close(self):
61 | self.wd.close()
62 |
63 |
64 | def get_format(wd, option={}):
65 | return wd.add_format(option)
66 |
67 |
68 | # def link_format(wd):
69 | # red_format = wd.add_format({
70 | # 'font_color': 'red',
71 | # 'bold': 1,
72 | # 'underline': 1,
73 | # 'font_size': 12,
74 | # })
75 | def get_format_center(wd, num=1):
76 | return wd.add_format({'align': 'center', 'valign': 'vcenter', 'border': num})
77 |
78 |
79 | def set_border_(wd, num=1):
80 | return wd.add_format({}).set_border(num)
81 |
82 |
83 | def _write_center(worksheet, cl, data, wd):
84 | return worksheet.write(cl, data, get_format_center(wd))
85 |
86 |
87 | def set_row(worksheet, num, height):
88 | worksheet.set_row(num, height)
89 |
90 | # 生成饼形图
91 |
92 |
93 | def pie(workbook, worksheet):
94 | chart1 = workbook.add_chart({'type': 'pie'})
95 | chart1.add_series({
96 | 'name': '自动化测试统计',
97 | 'categories': '=测试总况!$C$4:$C$5',
98 | 'values': '=测试总况!$D$4:$D$5',
99 | })
100 | chart1.set_title({'name': '测试统计'})
101 | chart1.set_style(10)
102 | worksheet.insert_chart('A9', chart1, {'x_offset': 25, 'y_offset': 10})
103 |
104 |
105 | if __name__ == '__main__':
106 | sum = {'testSumDate': '25秒', 'sum': 10, 'pass': 5, 'testDate': '2017-06-05 15:26:49', 'fail': 5,
107 | 'appVersion': '17051515', 'appSize': '14M', 'appName': "'简书'"}
108 | info = [{"id": 1, "title": "第一次打开", "caseName": "testf01", "result": "通过", "phoneName": "三星"},
109 | {"id": 1, "title": "第一次打开",
110 | "caseName": "testf01", "result": "通过", "img": "d:\\1.PNG", "phoneName": "华为"}]
111 | workbook = xlsxwriter.Workbook('Report.xlsx')
112 | worksheet = workbook.add_worksheet("测试总况")
113 | worksheet2 = workbook.add_worksheet("测试详情")
114 | bc = OperateReport(wd=workbook)
115 | bc.init(worksheet, sum)
116 | bc.detail(worksheet2, info)
117 | bc.close()
118 | #
119 |
--------------------------------------------------------------------------------
/Base/BaseFile.py:
--------------------------------------------------------------------------------
1 | import os
2 | import time
3 |
4 | PATH = lambda p: os.path.abspath(
5 | os.path.join(os.path.dirname(__file__), p)
6 | )
7 | '''
8 | 操作文件
9 | '''
10 |
11 |
12 | class BaseFile(object):
13 | def __init__(self):
14 | pass
15 |
16 | def check_file(self, path):
17 | if not os.path.isfile(path):
18 | # sys.exit()
19 | return False
20 | else:
21 | return True
22 |
23 | def mk_file(self, path):
24 | with open(path, 'w', encoding="utf-8") as f:
25 | print("创建文件成功")
26 | pass
27 |
28 | def write(self, path, line):
29 | time.sleep(1)
30 | with open(path, 'a') as fileHandle:
31 | fileHandle.write(line + "\n")
32 |
33 | def read(self, path):
34 | result = []
35 | with open(path, 'r', encoding="utf-8") as fileHandle:
36 | file_list = fileHandle.readlines()
37 | for i in file_list:
38 | temp = [i.replace("\t", ",").strip("\n")]
39 | result.append(temp)
40 | return result
41 |
42 | def remove_file(self, path):
43 | if self.check_file(path):
44 | os.remove(path)
45 |
46 |
47 | if __name__ == '__main__':
48 | pass
49 |
--------------------------------------------------------------------------------
/Base/BaseGetExcel.py:
--------------------------------------------------------------------------------
1 | import xlrd
2 | import xlsxwriter
3 | from Base.BaseElementEnmu import Element
4 | from Base.BaseExcel import *
5 | from Base.BaseStatistics import readInfo
6 |
7 |
8 | def read_excel(file='c:/test.xls'):
9 | data = xlrd.open_workbook(file)
10 | table = data.sheet_by_index(0)
11 | nrows = table.nrows
12 | ncols = table.ncols
13 | colnames = table.row_values(0) # one rows data
14 | list = []
15 | for rownum in range(1, nrows):
16 | row = table.row_values(rownum)
17 | if row:
18 | app = {}
19 | for i in range(len(colnames)):
20 | # row[i] = colnames[i] + row[i]
21 | app[colnames[i]] = row[i]
22 | list.append(app)
23 | return list
24 |
25 |
26 | def write_excel():
27 | workbook = xlsxwriter.Workbook(Element.REPORT_FILE)
28 | worksheet2 = workbook.add_worksheet("测试详情")
29 | operateReport = OperateReport(workbook)
30 | operateReport.detail(worksheet2, readInfo(Element.INFO_FILE))
31 | operateReport.close()
32 |
33 | if __name__ == "__main__":
34 | t = read_excel(Element.API_FILE)
35 | print(t)
--------------------------------------------------------------------------------
/Base/BaseIni.py:
--------------------------------------------------------------------------------
1 | import configparser
2 |
3 | '''
4 | 对ini文件的读写改
5 | '''
6 |
7 |
8 | class BaseIni(object):
9 | def __init__(self, path):
10 | self.cfg = configparser.ConfigParser()
11 | self.cfg.read(path)
12 |
13 | def read_ini(self):
14 | _pict = self.cfg.get("default", "pict")
15 | return True if _pict.lower() == 'true' else False
16 |
17 | def __write_ini(self):
18 | self.cfg.add_section("default1")
19 | self.cfg.set("default1", "title", "test msg")
20 | self.cfg.set("default1", "id", "test msg")
21 | self.cfg.add_section("ematter")
22 | self.cfg.set("ematter", "pages", 250)
23 | self.cfg.write(open('1.ini', "w"))
24 |
25 | def __edit_ini(self):
26 | self.cfg.set("default", "pict", "True")
27 | self.cfg.write(open('1.ini', "r+"))
28 |
29 | if __name__ == "__main__":
30 | from Base.BaseElementEnmu import Element
31 | t = BaseIni(Element.OPEN_PICT).read_ini()
32 | print(t)
--------------------------------------------------------------------------------
/Base/BaseInit.py:
--------------------------------------------------------------------------------
1 | from Base.BaseFile import BaseFile
2 | from Base.BaseElementEnmu import Element
3 |
4 |
5 | class BaseInit(object):
6 | def __init__(self):
7 | self.bf = BaseFile()
8 |
9 | def mk_file(self):
10 | self.__destroy()
11 | self.bf.mk_file(Element.INFO_FILE)
12 |
13 | def __destroy(self):
14 | self.bf.remove_file(Element.INFO_FILE)
15 |
--------------------------------------------------------------------------------
/Base/BaseParams.py:
--------------------------------------------------------------------------------
1 | import uuid
2 | from allpairspy import AllPairs
3 | # pip install allpairspy
4 |
5 | from collections import OrderedDict
6 |
7 |
8 | class BaseFuzzParams(object):
9 | """ 设置接口的逆向参数
10 | 自动生成模糊接口参数第一步,提前准备逆向场景
11 | Args:
12 | d: dict类型,正向接口参数
13 | Returns:
14 | dict
15 | Raises:
16 | 无
17 | """
18 |
19 | def __get_data(self, d):
20 | data = {}
21 | for i in d:
22 | data[i] = []
23 | # 加入一般规则
24 | data[i].append({"info": "正确的值", "code": 1, "value": d[i], "key": i})
25 | data[i].append({"info": "为空", "code": -1, "value": "", "key": i})
26 | data[i].append({"info": "错误的值", "code": -2, "value": self.__param_format(type(d[i])), "key": i})
27 | data[i].append({"info": "删除", "code": -3, "key": i})
28 | # 加入其它规则:如路径遍历,xss,注入
29 | return data
30 |
31 | '''
32 | 生成逆向场景参数
33 | '''
34 |
35 | def __param_format(self, key):
36 | if key == str:
37 | return str(uuid.uuid1())
38 | elif key == int:
39 | return 963852 # 也可以使用随机整数的方式
40 | elif key == list:
41 | return [str(uuid.uuid1())]
42 | elif key == dict:
43 | return {}
44 | elif key == "inject":
45 | return "t'exec master..xp_cmdshell 'nslookup www.google.com'--"
46 | # 路径遍历
47 | elif key == "path_traversal":
48 | pass
49 | else:
50 | return "null"
51 |
52 | '''
53 | 得到逆向场景参数后,用AllPairs生成全对偶参数
54 | '''
55 |
56 | def __set_fuzz(self, d):
57 | data = []
58 | for i, par in enumerate(AllPairs(OrderedDict(d))):
59 | app = []
60 | for j in par:
61 | app.append(j)
62 | data.append(app)
63 |
64 | dd = []
65 | for i in data:
66 | d = []
67 | for j in range(len(i)):
68 | d.append(i[j])
69 | dd.append(d)
70 |
71 | d2 = []
72 | for i in dd:
73 | d1 = []
74 | for j in i:
75 | app = {}
76 | if j.get("code", -9) == -1:
77 | app[j["key"]] = ""
78 | elif j.get("code", -9) == -3:
79 | pass
80 | else:
81 | app[j["key"]] = j["value"]
82 | app["info"] = j["key"] + j["info"]
83 | d1.append(app)
84 | d2.append(d1)
85 | return d2
86 | '''
87 | 对外的函数,处理生成的对偶场景接口参数
88 | Returns:
89 | [{},{}]
90 | '''
91 | def param_fi(self, d):
92 | g_data = self.__get_data(d)
93 | s_fuzz = self.__set_fuzz(g_data)
94 | data = []
95 | for i in s_fuzz:
96 | for j in range(len(i)):
97 | _info = ""
98 | for k in range(len(i)):
99 | _info = _info + "," + i[k]["info"]
100 | i[0].update(i[k])
101 | i[0]["info"] = _info.strip(",")
102 | data.append(i[0])
103 | break
104 | return data
105 | if __name__ == "__main__":
106 | fz = BaseFuzzParams().param_fi({"user": "name", "id": 1001, "pwd": "!@#$^&*", "data": {"test": "hello"}, "my_list":["1", "2"]})
107 | print(fz)
--------------------------------------------------------------------------------
/Base/BaseReq.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import json
3 | import ast
4 | from Base.BaseElementEnmu import Element
5 | from Base.BaseParams import BaseFuzzParams
6 | from Base.BaseStatistics import writeInfo
7 |
8 | class Config(object):
9 | def __init__(self):
10 | pass
11 |
12 | def config_req(self, kw):
13 | app = {}
14 | header = {"Accept": "*/*", "Content-Type": "application/json;charset=utf-8"}
15 | for item in kw:
16 | url = "%s://%s" % (item["protocol"], item["url"])
17 | print("==请求url:%s" % url)
18 | print("==请求参数:%s" % item["params"])
19 | params = "{}"
20 | if item.get("params"):
21 | params = item["params"]
22 | if item["method"] == "get":
23 | res = requests.get(url, data=json.dumps(ast.literal_eval(params)), headers=header, verify=False)
24 | elif item["method"] == "post":
25 | res = requests.post(url, data=json.dumps(ast.literal_eval(params)), headers=header, verify=False)
26 | else:
27 | print("现在只针post和ge方法进行了测试,其他方法请自行扩展")
28 | app["url"] = item["url"]
29 | app["method"] = item["method"]
30 | app["params"] = item["params"]
31 | app["code"] = str(res.status_code)
32 | app["msg"] = item["mark"]
33 | app["hope"] = item.get("hope", "")
34 | app["res"] = str(res.text)
35 | print("==响应结果=:%s=" % app["res"])
36 | app["ress"] = res # 传给检查函数进行解析
37 |
38 | app["result"] = self.__check(app["hope"], app["ress"])
39 | print("==响应码=:%s=" % app["code"])
40 |
41 | writeInfo(app, Element.INFO_FILE)
42 |
43 | def config_req_pict(self, kw, req=None):
44 | app = {}
45 | header = {"Accept": "*/*", "Content-Type": "application/json;charset=utf-8"}
46 | for item in kw:
47 | url = "%s://%s" % (item["protocol"], item["url"])
48 | # 如果有参数才做模糊测试,没有做正向场景测试
49 | if item.get("params"):
50 | print("进行逆向场景测试")
51 | params = BaseFuzzParams().param_fi(ast.literal_eval(item["params"]))
52 | for i in params:
53 | _info = ""
54 | if i.get("info", "null") != "null":
55 | _info = i.get("info", "参数正确")
56 | i.pop("info")
57 | if item["method"] == "get":
58 | res = requests.get(url, data=json.dumps(i), headers=header)
59 | else:
60 | res = requests.post(url, data=json.dumps(i), headers=header)
61 | app["url"] = item["url"]
62 | app["method"] = item["method"]
63 | app["params"] = str(i)
64 | app["code"] = str(res.status_code)
65 | app["msg"] = item["mark"] + "_" + _info
66 | # app["hope"] = item.get("hope", "")
67 | app["hope"] = ""
68 | app["res"] = str(res.text)
69 | app["result"] = ""
70 | print("请求url:%s" % url)
71 | print("请求参数:%s" % app["params"])
72 | print("响应码:%s" % app["code"])
73 | print("响应结果:%s" % app["res"])
74 | writeInfo(app, Element.INFO_FILE)
75 | else:
76 |
77 | self.config_req(kw)
78 | def __check(self, hope, res):
79 | resp = json.dumps(json.loads(res.text), separators=(',', ':'))
80 | is_check = 0 # 0表示期望值不存在,没有进行检查;1成功;-1失败
81 | hopes = hope.split("|")
82 | if len(hopes) and len(hope):
83 | is_check = 1
84 | # 循环检查期望值是否在实际值中能找到
85 | for j in hopes:
86 | if resp.find(j) == -1:
87 | is_check = -1
88 | break
89 | if is_check == 0:
90 | return "未检查"
91 | elif is_check == 1:
92 | return "成功"
93 | else:
94 | return "失败"
95 |
--------------------------------------------------------------------------------
/Base/BaseReq1.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import json
3 | import ast
4 | from Base.BaseElementEnmu import Element
5 | from Base.BaseParams import BaseFuzzParams
6 | from Base.BaseStatistics import writeInfo
7 |
8 | class Config(object):
9 | def __init__(self, sessions):
10 | self.sessions = sessions
11 |
12 | def config_req(self, kw):
13 | app = {}
14 | header = {"Accept": "*/*", "Content-Type": "application/json;charset=utf-8"}
15 | for item in kw:
16 | url = "%s://%s" % (item["protocol"], item["url"])
17 | print("==请求url:%s" % url)
18 | print("==请求参数:%s" % item["params"])
19 | params = "{}"
20 | if item.get("params"):
21 | params = item.get("params")
22 | if item["method"] == "get":
23 | res = self.sessions.get(url, data=json.dumps(ast.literal_eval(params)), headers=header, verify=False)
24 | elif item["method"] == "post":
25 | res = self.sessions.post(url, data=json.dumps(ast.literal_eval(params)), headers=header, verify=False)
26 | else:
27 | print("现在只针post和ge方法进行了测试,其他方法请自行扩展")
28 | app["url"] = item["url"]
29 | app["method"] = item["method"]
30 | app["params"] = item["params"]
31 | app["code"] = str(res.status_code)
32 | app["msg"] = item["mark"]
33 | app["hope"] = item.get("hope", "")
34 | app["res"] = str(res.text)
35 | app["ress"] = res # 传给检查函数进行解析
36 | print("==响应结果:%s=" % app["res"])
37 |
38 | app["result"] = self.__check(app["hope"], app["ress"])
39 | print("==响应码:%s=" % app["code"])
40 |
41 | writeInfo(app, Element.INFO_FILE)
42 |
43 | def config_req_pict(self, kw, req=None):
44 | app = {}
45 | header = {"Accept": "*/*", "Content-Type": "application/json;charset=utf-8"}
46 | for item in kw:
47 | url = "%s://%s" % (item["protocol"], item["url"])
48 | # 如果有参数才做模糊测试,没有做正向场景测试
49 | if item.get("params"):
50 | print("进行逆向场景测试")
51 | params = BaseFuzzParams().param_fi(ast.literal_eval(item["params"]))
52 | for i in params:
53 | _info = ""
54 | if i.get("info", "null") != "null":
55 | _info = i.get("info", "参数正确")
56 | i.pop("info")
57 | if item["method"] == "get":
58 | res = self.sessions.get(url, data=json.dumps(i), headers=header)
59 | else:
60 | res = self.sessions.post(url, data=json.dumps(i), headers=header)
61 | app["url"] = item["url"]
62 | app["method"] = item["method"]
63 | app["params"] = str(i)
64 | app["code"] = str(res.status_code)
65 | app["msg"] = item["mark"] + "_" + _info
66 | # app["hope"] = item.get("hope", "")
67 | app["hope"] = ""
68 | app["res"] = str(res.text)
69 | app["result"] = ""
70 | print("请求url:%s" % url)
71 | print("请求参数:%s" % app["params"])
72 | print("响应码:%s" % app["code"])
73 | print("响应结果:%s" % app["res"])
74 | writeInfo(app, Element.INFO_FILE)
75 | else:
76 |
77 | self.config_req(kw)
78 |
79 | def __check(self, hope, res):
80 | resp = json.dumps(json.loads(res.text), separators=(',', ':'))
81 | is_check = 0 # 0表示期望值不存在,没有进行检查;1成功;-1失败
82 | hopes = hope.split("|")
83 | if len(hopes) and len(hope):
84 | is_check = 1
85 | # 循环检查期望值是否在实际值中能找到
86 | for j in hopes:
87 | if resp.find(j) == -1:
88 | is_check = -1
89 | break
90 | if is_check == 0:
91 | return "未检查"
92 | elif is_check == 1:
93 | return "成功"
94 | else:
95 | return "失败"
96 |
--------------------------------------------------------------------------------
/Base/BaseRunner.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | import unittest
3 |
4 | import requests
5 |
6 |
7 | # 登录
8 | def get_session():
9 | req = requests.session()
10 | url = ""
11 | data = {}
12 | req.post(url, data, verify=False)
13 | return req
14 |
15 |
16 | class ParametrizedTestCase(unittest.TestCase):
17 | """ TestCase classes that want to be parametrized should
18 | inherit from this class.
19 | """
20 |
21 | def __init__(self, methodName='runTest', param=None):
22 | super(ParametrizedTestCase, self).__init__(methodName)
23 |
24 | @classmethod
25 | def setUpClass(cls):
26 | # cls.rq = get_session() # 登录后的session
27 | pass
28 |
29 | @classmethod
30 | def tearDownClass(cls):
31 | pass
32 |
33 | @staticmethod
34 | def parametrize(testcase_klass, param=None):
35 | testloader = unittest.TestLoader()
36 | testnames = testloader.getTestCaseNames(testcase_klass)
37 | suite = unittest.TestSuite()
38 | for name in testnames:
39 | suite.addTest(testcase_klass(name, param=param))
40 | return suite
41 |
--------------------------------------------------------------------------------
/Base/BaseRunner1.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | import unittest
3 |
4 | import requests
5 |
6 |
7 | # 登录
8 | def get_session():
9 | req = requests.session()
10 | url = "http://127.0.0.1:8000/myapi/login/"
11 | data = {"username": "test1", "pwd": "1234567"}
12 | req.post(url, data, verify=False)
13 | return req
14 |
15 |
16 | class ParametrizedTestCase(unittest.TestCase):
17 | """ TestCase classes that want to be parametrized should
18 | inherit from this class.
19 | """
20 |
21 | def __init__(self, methodName='runTest', param=None):
22 | super(ParametrizedTestCase, self).__init__(methodName)
23 |
24 | @classmethod
25 | def setUpClass(cls):
26 | cls.sessions = get_session() # 登录后的session
27 |
28 | @classmethod
29 | def tearDownClass(cls):
30 | pass
31 |
32 | @staticmethod
33 | def parametrize(testcase_klass, param=None):
34 | testloader = unittest.TestLoader()
35 | testnames = testloader.getTestCaseNames(testcase_klass)
36 | suite = unittest.TestSuite()
37 | for name in testnames:
38 | suite.addTest(testcase_klass(name, param=param))
39 | return suite
40 |
--------------------------------------------------------------------------------
/Base/BaseStatistics.py:
--------------------------------------------------------------------------------
1 | import pickle
2 |
3 |
4 | def readInfo(path):
5 | data = []
6 | with open(path, 'rb') as f:
7 | try:
8 | data = pickle.load(f)
9 | print(data)
10 | except EOFError:
11 | data = []
12 | # print("读取文件错误")
13 | # print("------read-------")
14 | # print(data)
15 | return data
16 |
17 |
18 | def writeInfo(kw, path="data.pickle"):
19 | """
20 | :type data: dict
21 | """
22 | data = {"result": kw["result"], "hope": kw["hope"], "msg": kw["msg"], "url": kw["url"], "params": kw["params"]
23 | ,"code": kw["code"], "method": kw["method"], "res": kw['res']}
24 | _read = readInfo(path)
25 | result = []
26 | if _read:
27 | _read.append(data)
28 | result = _read
29 | else:
30 | result.append(data)
31 | with open(path, 'wb') as f:
32 | pickle.dump(result, f)
33 |
--------------------------------------------------------------------------------
/Base/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__init__.py
--------------------------------------------------------------------------------
/Base/__pycache__/BaseElementEnmu.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseElementEnmu.cpython-34.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseElementEnmu.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseElementEnmu.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseExcel.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseExcel.cpython-34.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseExcel.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseExcel.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseFile.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseFile.cpython-34.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseFile.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseFile.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseGetExcel.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseGetExcel.cpython-34.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseGetExcel.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseGetExcel.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseIni.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseIni.cpython-34.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseIni.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseIni.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseInit.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseInit.cpython-34.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseInit.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseInit.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseParams.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseParams.cpython-34.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseParams.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseParams.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseReq.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseReq.cpython-34.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseReq.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseReq.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseReq1.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseReq1.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseRunner.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseRunner.cpython-34.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseRunner.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseRunner.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseRunner1.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseRunner1.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseStatistics.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseStatistics.cpython-34.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/BaseStatistics.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/BaseStatistics.cpython-36.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/__init__.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/__init__.cpython-34.pyc
--------------------------------------------------------------------------------
/Base/__pycache__/__init__.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Base/__pycache__/__init__.cpython-36.pyc
--------------------------------------------------------------------------------
/Log/info.pickle:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Log/info.pickle
--------------------------------------------------------------------------------
/Log/param.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Log/param.txt
--------------------------------------------------------------------------------
/Log/param_result.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Log/param_result.txt
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/README.md
--------------------------------------------------------------------------------
/Report/Report.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Report/Report.xlsx
--------------------------------------------------------------------------------
/Report/api.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Report/api.xlsx
--------------------------------------------------------------------------------
/Runner/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/Runner/__init__.py
--------------------------------------------------------------------------------
/Runner/runner.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 | import sys
3 | sys.path.append("..")
4 | import unittest
5 | from TestCases.Api import ApiTest
6 | from Base.BaseRunner import ParametrizedTestCase
7 | from Base.BaseGetExcel import write_excel
8 | from Base.BaseInit import BaseInit
9 |
10 |
11 | def runner_case():
12 | BaseInit().mk_file()
13 | suite = unittest.TestSuite()
14 | suite.addTest(ParametrizedTestCase.parametrize(ApiTest))
15 | unittest.TextTestRunner(verbosity=2).run(suite)
16 |
17 |
18 | if __name__ == '__main__':
19 | runner_case()
20 | write_excel()
21 |
--------------------------------------------------------------------------------
/Runner/runner1.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 | import sys
3 | sys.path.append("..")
4 | import unittest
5 | from TestCases.Api1 import ApiTest
6 | from Base.BaseRunner1 import ParametrizedTestCase
7 | from Base.BaseGetExcel import write_excel
8 | from Base.BaseInit import BaseInit
9 |
10 |
11 | def runner_case():
12 | BaseInit().mk_file()
13 | suite = unittest.TestSuite()
14 | suite.addTest(ParametrizedTestCase.parametrize(ApiTest))
15 | unittest.TextTestRunner(verbosity=2).run(suite)
16 |
17 |
18 | if __name__ == '__main__':
19 | runner_case()
20 | write_excel()
21 |
--------------------------------------------------------------------------------
/Runner/start_test.bat:
--------------------------------------------------------------------------------
1 | @ECHO OFF
2 | python runner.py
3 | ECHO.[ EXIT ] press any key...
4 |
5 | PAUSE>nul
--------------------------------------------------------------------------------
/Setting/Config.ini:
--------------------------------------------------------------------------------
1 | [default]
2 | pict = False
--------------------------------------------------------------------------------
/TestCases/Api.py:
--------------------------------------------------------------------------------
1 | from Base.BaseRunner import ParametrizedTestCase
2 | from Base.BaseGetExcel import read_excel
3 | from Base.BaseReq import Config
4 | from Base.BaseElementEnmu import Element
5 | from Base.BaseIni import BaseIni
6 |
7 |
8 | class ApiTest(ParametrizedTestCase):
9 | def test_api(self):
10 | ls = read_excel(Element.API_FILE)
11 | if BaseIni(Element.OPEN_PICT).read_ini():
12 | Config().config_req_pict(ls)
13 | else:
14 | Config().config_req(ls)
15 |
16 | @classmethod
17 | def setUpClass(cls):
18 | super(ApiTest, cls).setUpClass()
19 | # cls.req
20 |
--------------------------------------------------------------------------------
/TestCases/Api1.py:
--------------------------------------------------------------------------------
1 | from Base.BaseRunner1 import ParametrizedTestCase
2 | from Base.BaseGetExcel import read_excel
3 | from Base.BaseReq1 import Config
4 | from Base.BaseElementEnmu import Element
5 | from Base.BaseIni import BaseIni
6 |
7 |
8 | class ApiTest(ParametrizedTestCase):
9 | def test_api(self):
10 | ls = read_excel(Element.API_FILE)
11 | if BaseIni(Element.OPEN_PICT).read_ini():
12 | Config(self.sessions).config_req_pict(ls)
13 | else:
14 | Config(self.sessions).config_req(ls)
15 |
16 | @classmethod
17 | def setUpClass(cls):
18 | super(ApiTest, cls).setUpClass()
19 |
--------------------------------------------------------------------------------
/TestCases/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/TestCases/__init__.py
--------------------------------------------------------------------------------
/TestCases/__pycache__/Api.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/TestCases/__pycache__/Api.cpython-34.pyc
--------------------------------------------------------------------------------
/TestCases/__pycache__/Api.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/TestCases/__pycache__/Api.cpython-36.pyc
--------------------------------------------------------------------------------
/TestCases/__pycache__/Api1.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/TestCases/__pycache__/Api1.cpython-36.pyc
--------------------------------------------------------------------------------
/TestCases/__pycache__/__init__.cpython-34.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/TestCases/__pycache__/__init__.cpython-34.pyc
--------------------------------------------------------------------------------
/TestCases/__pycache__/__init__.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/TestCases/__pycache__/__init__.cpython-36.pyc
--------------------------------------------------------------------------------
/channel_log.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/channel_log.md
--------------------------------------------------------------------------------
/img/api.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/img/api.jpg
--------------------------------------------------------------------------------
/img/no_pict.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/img/no_pict.jpg
--------------------------------------------------------------------------------
/img/pict.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Louis-me/auto_http_api/5a7ff01845e43d441fef8ae955b056085ab2dd10/img/pict.jpg
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | requests==2.24.0
2 | XlsxWriter==1.3.7
3 | xlrd==1.2.0
4 | allpairspy==2.5.0
5 |
--------------------------------------------------------------------------------