diff --git a/Runner/API/1.html b/Runner/API/1.html
index c65c672..8ef0ca9 100644
--- a/Runner/API/1.html
+++ b/Runner/API/1.html
@@ -229,7 +229,7 @@
series: [{
name: '通过',
color: '#64bb64',
- data: [1]
+ data: [4]
}, {
name: '失败',
color: '#f16d7e',
@@ -237,7 +237,7 @@
}, {
name: '错误',
color: '#fdc68c',
- data: [2]
+ data: [0]
}]
})
// 增加饼状图
@@ -291,7 +291,7 @@
innerSize: '80%',
name: '比例',
data: [
- ['通过', 1], ['失败', 0], ['错误', 2]
+ ['通过', 4], ['失败', 0], ['错误', 0]
]
}]
}, function(c) {
@@ -438,15 +438,15 @@ function html_escape(s) {
测试报告
-
开始时间 : 2022-08-01 01:43:42
+
开始时间 : 2022-08-02 03:42:02
-
合计耗时 : 00:00:01
+
合计耗时 : 00:00:00
-
测试结果 : 总共 3,通过 1,失败 0,错误 2,通过率 33.33%
+
测试结果 : 总共 4,通过 4,失败 0,错误 0,通过率 100.00%
失败用例 : 无
-
错误用例 : 点击查看
- main.测试用例.test0002_None
- main.测试用例.test0003_None
+
错误用例 : 无
@@ -457,11 +457,11 @@ function html_escape(s) {
@@ -486,160 +486,180 @@ function html_escape(s) {
详细 |
-
+
测试用例 |
|
- 3 |
- 1 |
+ 4 |
+ 4 |
0 |
- 2 |
- 1.258秒 |
- 查看全部 |
+ 0 |
+ 0.890秒 |
+ 查看全部 |
- test0001_TestLogin |
- 正常登录 |
+ test0001_1 |
+ |
pt1_1:
-2022-08-01 01:43:42,869 - D: 正在执行:正常登录
-2022-08-01 01:43:44,092 - D:
+2022-08-02 03:42:02,491 - D: 正在执行:None
+2022-08-02 03:42:02,765 - D:
[->]
-POST /filebox.php?op=home HTTP/1.1
+GET /iplookup?type=json&ip=61.139.2.69 HTTP/1.1
Host: www.fanscloud.net
-User-Agent: curl
+User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
-Content-Length: 59
-Content-Type: application/x-www-form-urlencoded
+X-Online-Host: 127.0.0.1
+
-user=&pass=1234ABCDabcd&submitButtonName=%E7%99%BB%E5%BD%95
[<-]
HTTP/1.1 200 OK
Server: nginx
-Date: Sun, 31 Jul 2022 17:43:44 GMT
-Content-Type: text/html; charset=utf-8
+Date: Mon, 01 Aug 2022 19:42:02 GMT
+Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
-Vary: Accept-Encoding
-Set-Cookie: PHPSESSID=b9lvik70qp9ejqt0gtguv2evn4; path=/, user=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0, pass=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
-Expires: Thu, 19 Nov 1981 08:52:00 GMT
-Cache-Control: no-store, no-cache, must-revalidate
-Pragma: no-cache
-Content-Encoding: gzip
-<!DOCTYPE html>
-<meta name='robots' content='noindex,follow' />
-<head>
-<meta name='viewport' content='width=device-width, initial-scale=1'/>
-<title>www.fanscloud.net - 登录</title>
-</head>
-<body>
-<style>
-*{font-family:'Consolas';}.box{border:1px solid #ccc;b ... [MORE 94% OMITTED HERE]
+{
+ "status": 0,
+ "ip": "61.139.2.69",
+ "location": "\u56db\u5ddd\u7701\u6210\u90fd\u5e02",
+ "isp": "\u7535\u4fe1",
+ "ttl": 196140
+}
|
|
-
- test0002_None |
+
+ test0002_2 |
|
-
-
- et1_2:
-2022-08-01 01:43:44,094 - D: 正在执行:None
-Traceback (most recent call last):
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\indexes\base.py", line 3621, in get_loc
- return self._engine.get_loc(casted_key)
- File "pandas\_libs\index.pyx", line 136, in pandas._libs.index.IndexEngine.get_loc
- File "pandas\_libs\index.pyx", line 163, in pandas._libs.index.IndexEngine.get_loc
- File "pandas\_libs\hashtable_class_helper.pxi", line 2131, in pandas._libs.hashtable.Int64HashTable.get_item
- File "pandas\_libs\hashtable_class_helper.pxi", line 2140, in pandas._libs.hashtable.Int64HashTable.get_item
-KeyError: 0
+
+
+ pt1_2:
+2022-08-02 03:42:02,765 - D: 正在执行:None
+2022-08-02 03:42:02,960 - D:
+[->]
+GET /iplookup?type=xml HTTP/1.1
+Host: www.fanscloud.net
+User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
+Accept-Encoding: gzip, deflate
+Accept: */*
+Connection: keep-alive
+Cookie: user=zhaoyafan
-The above exception was the direct cause of the following exception:
-Traceback (most recent call last):
- File "D:\Project\AutoFramework\Runner\API\DefaultRunner.py", line 223, in foo
- def foo(self, index=i): return self._test_(index)
- File "D:\Project\AutoFramework\Runner\API\DefaultRunner.py", line 211, in test
- self.test_unit(data=main_case)
- File "D:\Project\AutoFramework\Runner\API\DefaultRunner.py", line 179, in test_unit
- HTTPCh = self.h.where((self.h['Env'] == self.envs) & (self.h['Name'] == data['HTTPCh']), inplace=False).dropna(how='all').loc[0].to_dict()
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\indexing.py", line 967, in __getitem__
- return self._getitem_axis(maybe_callable, axis=axis)
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\indexing.py", line 1202, in _getitem_axis
- return self._get_label(key, axis=axis)
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\indexing.py", line 1153, in _get_label
- return self.obj.xs(label, axis=axis)
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\generic.py", line 3864, in xs
- loc = index.get_loc(key)
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\indexes\base.py", line 3623, in get_loc
- raise KeyError(key) from err
-KeyError: 0
+[<-]
+HTTP/1.1 200 OK
+Server: nginx
+Date: Mon, 01 Aug 2022 19:42:02 GMT
+Content-Type: text/xml; charset=utf-8
+Transfer-Encoding: chunked
+Connection: keep-alive
+Vary: Accept-Encoding
+Content-Encoding: gzip
+
+<data><status>0</status>
+<ip>117.136.31.226</ip>
+<location>广东省</location>
+<isp>移动</isp>
+<ttl>2675952</ttl>
+</data>
|
- |
+ |
-
- test0003_None |
+
+ test0003_3 |
|
-
-
- et1_3:
-2022-08-01 01:43:44,120 - D: 正在执行:None
-Traceback (most recent call last):
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\indexes\base.py", line 3621, in get_loc
- return self._engine.get_loc(casted_key)
- File "pandas\_libs\index.pyx", line 136, in pandas._libs.index.IndexEngine.get_loc
- File "pandas\_libs\index.pyx", line 163, in pandas._libs.index.IndexEngine.get_loc
- File "pandas\_libs\hashtable_class_helper.pxi", line 2131, in pandas._libs.hashtable.Int64HashTable.get_item
- File "pandas\_libs\hashtable_class_helper.pxi", line 2140, in pandas._libs.hashtable.Int64HashTable.get_item
-KeyError: 0
+
+
+ pt1_3:
+2022-08-02 03:42:02,960 - D: 正在执行:None
+2022-08-02 03:42:03,191 - D:
+[->]
+GET /iplookup?ip=61.139.2.69 HTTP/1.1
+Host: www.fanscloud.net
+User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
+Accept-Encoding: gzip, deflate
+Accept: */*
+Connection: keep-alive
+Content-Length: 2706
+Content-Type: multipart/form-data; boundary=4b57104e32f8f2d3af8fc5c7795bb3fa
-The above exception was the direct cause of the following exception:
+--4b57104e32f8f2d3af8fc5c7795bb3fa\r\nContent-Disposition: form-data; name="file01"; filename="\xe6\x8e\xa5\xe5\x8f\xa3\xe6\x96\x87\xe6\xa1\xa3.md"\r\n\r\n# \xe6\x8e\xa5\xe5\x8f\xa3\xe6\x96\x87\xe6\xa1\xa3\n\n## \xe6\xb3\xa8\xe5\x86\x8c\xe6\x8e\xa5\xe5\x8f ... [MORE 93% OMITTED HERE]
+[<-]
+HTTP/1.1 200 OK
+Server: nginx
+Date: Mon, 01 Aug 2022 19:42:02 GMT
+Content-Type: text/html; charset=utf-8
+Transfer-Encoding: chunked
+Connection: keep-alive
+Vary: Accept-Encoding
+Content-Encoding: gzip
-Traceback (most recent call last):
- File "D:\Project\AutoFramework\Runner\API\DefaultRunner.py", line 223, in foo
- def foo(self, index=i): return self._test_(index)
- File "D:\Project\AutoFramework\Runner\API\DefaultRunner.py", line 211, in test
- self.test_unit(data=main_case)
- File "D:\Project\AutoFramework\Runner\API\DefaultRunner.py", line 179, in test_unit
- HTTPCh = self.h.where((self.h['Env'] == self.envs) & (self.h['Name'] == data['HTTPCh']), inplace=False).dropna(how='all').loc[0].to_dict()
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\indexing.py", line 967, in __getitem__
- return self._getitem_axis(maybe_callable, axis=axis)
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\indexing.py", line 1202, in _getitem_axis
- return self._get_label(key, axis=axis)
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\indexing.py", line 1153, in _get_label
- return self.obj.xs(label, axis=axis)
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\generic.py", line 3864, in xs
- loc = index.get_loc(key)
- File "D:\Project\AutoFramework\venv\lib\site-packages\pandas\core\indexes\base.py", line 3623, in get_loc
- raise KeyError(key) from err
-KeyError: 0
+61.139.2.69 四川省成都市 电信
|
- |
+ |
+
+
+
+ test0004_4 |
+ |
+
+
+
+ pt1_4:
+2022-08-02 03:42:03,191 - D: 正在执行:None
+2022-08-02 03:42:03,382 - D:
+[->]
+GET /iplookup HTTP/1.1
+Host: www.fanscloud.net
+User-Agent: curl/7.0
+Accept-Encoding: gzip, deflate
+Accept: */*
+Connection: keep-alive
+Cookie: user=zhaoyafan
+
+
+[<-]
+HTTP/1.1 200 OK
+Server: nginx
+Date: Mon, 01 Aug 2022 19:42:02 GMT
+Content-Type: text/html; charset=utf-8
+Transfer-Encoding: chunked
+Connection: keep-alive
+Vary: Accept-Encoding
+Content-Encoding: gzip
+
+117.136.31.226 广东省 移动
+
+
+
+ |
+ |
总计 |
- 3 |
- 1 |
+ 4 |
+ 4 |
0 |
- 2 |
- 1.258秒 |
- 通过:33.33% |
+ 0 |
+ 0.890秒 |
+ 通过:100.00% |
diff --git a/Runner/API/DefaultRunner.py b/Runner/API/DefaultRunner.py
index 04ada8c..72de830 100644
--- a/Runner/API/DefaultRunner.py
+++ b/Runner/API/DefaultRunner.py
@@ -1,69 +1,123 @@
import unittest
+from typing import Any, Text, Dict, List
from Business.Class.HTMLTestRunner import HTMLTestRunner
from Business.Class.ExcelUtils import *
from Business.Class.JsonOrYaml import *
from Base.Class.Http import *
from Base.Class.Database import *
from Base.Class.Logger import *
+
log = Logger(name='test', level='DEBUG')
+
class TestCase:
_g = {}
_l = {}
def __init__(
self,
- workbook,
- envs,
- level_list: list = None,
- workbook_config: dict = None,
- testcase: str = None,
- testdata: str = None,
- database: str = None,
- httpconf: str = None
+ workbook: Text,
+ testlves: List,
+ testcase: Text,
+ testdata: Text,
+ database: Text,
+ httpconf: Text
):
- if workbook_config is None: workbook_config = {}
- tabs = self._merge_dict(
- {
- 'HTTPConf': {
- 'sheet': httpconf
+ tabs = {
+ "HTTPConf": {
+ "fixed": {},
+ "views": "A4:C*",
+ "field": [
+ "Name",
+ "HostWithScheme",
+ "DefaultHeader"
+ ]
+ },
+ "DataBase": {
+ "fixed": {},
+ "views": "E4:L*",
+ "field": [
+ "Name",
+ "Type",
+ "Host",
+ "Port",
+ "User",
+ "Password",
+ "Database",
+ "Charset"
+ ]
+ },
+ "TestData": {
+ "fixed": {},
+ "views": "A4:E*",
+ "field": [
+ "Name",
+ "Delimiter",
+ "Data",
+ "FileData",
+ "VarNameList"
+ ]
+ },
+ "TestCase": {
+ "fixed": {
+ "ItemName": "B3",
+ "SessMode": "E3"
},
- 'DataBase': {
- 'sheet': database
- },
- 'TestData': {
- 'sheet': testdata
- },
- 'TestCase': {
- 'sheet': testcase
- }
+ "views": "A7:AG*",
+ "field": [
+ "Flag",
+ "PreExecCase",
+ "PreExecRule",
+ "Module",
+ "CaseId",
+ "CaseTitle",
+ "CaseDesc",
+ "CaseLevel",
+ "HTTPChannel",
+ "HTTPMethod",
+ "HTTPUri",
+ "HTTPQuery",
+ "HTTPRedirect",
+ "HTTPHeaders",
+ "HTTPCookies",
+ "HTTPParamType",
+ "HTTPParamContent",
+ "HTTPParamOfFile",
+ "HTTPExtract",
+ "HTTPAssertStatus",
+ "HTTPAssertHeaders",
+ "HTTPAssertCookies",
+ "HTTPAssertBody",
+ "HTTPAssertJson",
+ "DatabaseCh",
+ "DatabaseSqlQuery",
+ "DatabaseExtract",
+ "DatabaseAssertData",
+ "DatabaseAssertCount",
+ "DataSet",
+ "Author",
+ "TestTime",
+ "TestResult"
+ ]
}
- , workbook_config)
- # tabs = {
- # 'HTTPConf': {
- # 'sheet': '数据配置'
- # },
- # 'DataBase': {
- # 'sheet': '数据配置'
- # },
- # 'TestData': {
- # 'sheet': '数据配置'
- # },
- # 'TestCase': {
- # 'sheet': '测试用例'
- # }
- # }
+ }
import os
from pandas.core.frame import DataFrame
init = Excel().open(workbook, read_only=True)
- file = os.path.splitext(workbook)[0] + '.json'
- conf = self._merge_dict((os.path.exists(file) and auto_decode(open(file, 'r', encoding='utf-8').read())) or {}, tabs)
- # print(json_encode(conf, indent=4, unicode=False))
- # exit()
data = {}
- for k, v in conf.items():
- sheet_name = ('sheet' in v and v['sheet'] or v['default_sheet'])
- init.select(sheet_name)
+ for k, v in tabs.items():
+ match k:
+ case 'TestCase':
+ sheet = testcase
+ case 'TestData':
+ sheet = testdata
+ case 'DataBase':
+ sheet = database
+ case 'HTTPConf':
+ sheet = httpconf
+ case _:
+ continue
+ init.select(sheet)
data[k] = {}
if 'fixed' in v.keys():
data[k]['fixed'] = {}
@@ -71,13 +125,9 @@ class TestCase:
data[k]['fixed'][key] = init.cellGet(cell=value)
if 'views' in v.keys() and 'field' in v.keys():
data[k]['views'] = DataFrame(read_view_dict(
- filename=workbook, sheet=sheet_name, area=v['views'], fields=v['field'], auto_truncate=True))
+ filename=workbook, sheet=sheet, area=v['views'], fields=v['field'], auto_truncate=True))
else:
init.exit()
- # print(json_encode(data['DataBase'], indent=4, unicode=False))
- # exit()
-
- self.envs = envs
self.case = testcase
self.http = Request
self.dirs = os.path.dirname(workbook)
@@ -89,13 +139,11 @@ class TestCase:
self.d = data['TestData']['views']
self.c = data['TestCase']['views']
- self._setLevels(level_list)
+ self._setLevels(testlves)
self._setRequestMode(self.m)
-
def _setRequestMode(self, value=None):
self.http = [Request, Session][value in ['会话模式', 'Session', 'session']]()
- return True
def _setLevels(self, level_list=None):
if isinstance(level_list, (list, tuple, str)):
@@ -176,34 +224,39 @@ class TestCase:
# 开始测试
log.d('正在执行:%s' % data['CaseTitle'])
# 请求构造
- HTTPCh = self.h.where((self.h['Env'] == self.envs) & (self.h['Name'] == data['HTTPCh']), inplace=False).dropna(how='all').loc[0].to_dict()
+ locals().setdefault('HTTPChannel', self.h.where((self.h['Name'] == data['HTTPChannel']), inplace=False).dropna(how='all').loc[0].to_dict())
resKwArgs = {
- 'debug': True,
- 'method': data['HTTPMethod'],
- 'url': self._sub_variable_auto((HTTPCh['HostWithScheme'] or '') + (data['HTTPUri'] or '/'), [self._g, self._l]),
- 'query': self._sub_variable_auto(auto_decode(data['HTTPQuery']), [self._g, self._l]),
- 'header': self._sub_variable_auto(auto_decode(data['HTTPHeaders']), [self._g, self._l]),
- 'cookie': self._sub_variable_auto(auto_decode(data['HTTPCookies']), [self._g, self._l]),
- 'auto_redirect': data['HTTPRedirect'] in ['是', 'True', 'true']
+ 'method': data['HTTPMethod'] or 'GET',
+ 'url': self._sub_variable_auto((locals().get('HTTPChannel')['HostWithScheme'] or '') + (data['HTTPUri'] or '/'),
+ [self._g, self._l]),
+ 'query': self._sub_variable_auto(auto_decode(data['HTTPQuery']), [self._g, self._l]),
+ 'data': None,
+ 'data_json': None,
+ 'data_file': None,
+ 'header': {},
+ 'cookie': self._sub_variable_auto(auto_decode(data['HTTPCookies']), [self._g, self._l]),
+ 'auth': None,
+ 'timeout': 60,
+ 'proxy': None,
+ 'auto_redirect': data['HTTPRedirect'] in ['是', 'True', 'true'],
+ 'ignore_cert_error': False,
+ 'debug': True
}
+ resKwArgs['header'].update(auto_decode(locals().get('HTTPChannel')['DefaultHeader']) or {})
+ resKwArgs['header'].update(self._sub_variable_auto(auto_decode(data['HTTPHeaders']), [self._g, self._l]) or {})
match self._matchParmType(data['HTTPParamType']):
case 10:
resKwArgs['data_json'] = self._sub_variable_auto(auto_decode(data['HTTPParamContent']))
case 20:
- resKwArgs['data'] = self._sub_variable_auto(auto_decode(data['HTTPParamContent']))
+ resKwArgs['data'] = self._sub_variable_auto(auto_decode(data['HTTPParamContent']))
case _:
- resKwArgs['data'] = self._sub_variable_auto(data['HTTPParamContent'])
- HTTPParamOfFile = self._sub_variable_auto(auto_decode(data['HTTPParamOfFile']))
- if isinstance(HTTPParamOfFile, dict):
- resKwArgs['data_file'] = {k: open(os.path.abspath(os.path.join(self.dirs, './%s' % v)), 'rb') for k, v in HTTPParamOfFile.items()}
- # for k, v in HTTPParamOfFile:
- # HTTPParamOfFile[k] = open(os.path.abspath(os.path.join(self.dirs, './%s' % v)), 'rb')
- # resKwArgs['data_file'] = HTTPParamOfFile
+ resKwArgs['data'] = self._sub_variable_auto(data['HTTPParamContent'])
+ # httpParamOfFile = self._sub_variable_auto(auto_decode(data['HTTPParamOfFile']))
+ resKwArgs['data_file'] = locals().setdefault('httpParamOfFile', self._sub_variable_auto(auto_decode(
+ data['HTTPParamOfFile']))) and {k: open(os.path.abspath(os.path.join(self.dirs, './%s' % v)), 'rb') for k, v in locals().get('httpParamOfFile').items()}
res = self.http.http(**resKwArgs)
log.d('\n%s' % (res['brief'] or ''))
- # print(res)
- # print(HTTPCh)
def test(self, index):
# print(view_case.loc[index])
@@ -213,6 +266,7 @@ class TestCase:
def main(self):
class ClassTestCase(unittest.TestCase):
pass
+
ClassTestCase.__qualname__ = self.case
ClassTestCase._test_ = self.test
serial = 0
@@ -220,7 +274,10 @@ class TestCase:
thisCase = self.c.loc[i].to_dict()
if not self._matchCaseType(thisCase['Flag']) == 10 and self._matchLevelRun(thisCase['CaseLevel']): continue
serial += 1
- def foo(self, index=i): return self._test_(index)
+
+ def foo(self, index=i):
+ return self._test_(index)
+
foo.__doc__ = thisCase['CaseTitle']
exec('ClassTestCase.test%s_%s = foo' % (str('%04d' % serial), str(thisCase['CaseId'])))
return ClassTestCase
@@ -230,9 +287,11 @@ if __name__ == '__main__':
test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(testCaseClass=TestCase(
workbook='D:/Desktop/接口自动化测试用例.xlsx',
- envs='测试环境',
- level_list=['P0'],
- testcase='测试用例'
+ testlves=['P0'],
+ testcase='测试用例',
+ testdata='测试数据',
+ httpconf='请求配置',
+ database='请求配置'
).main(), prefix='test'))
HTMLTestRunner(verbosity=5, report=os.path.abspath(os.path.join(os.path.dirname(__file__), './1.html'))).run(
test_suite)
diff --git a/main2.py b/main2.py
index 4aa5642..60b5aba 100644
--- a/main2.py
+++ b/main2.py
@@ -1,3 +1,14 @@
-from Base.Class.Yaml import *
-print(yaml_decode('sess:\n- json'))
-
+# from Base.Class.Yaml import *
+# print(yaml_decode('sess:\n- json'))
+#
+# a = {"Host": '127.0.0.1', "User-Agent": 'Chrome'}
+# b = {"Host": 'www.baidu.com', "User-Agent": 'curl'}
+# c = {}
+# c.update(a)
+# c.update(b)
+# print(c)
+#
+#
+print(locals().setdefault('a', 123))
+print(locals().get('a'))
+print(globals().get('a'))