Commit eec2ab68c93a9df6662533f5ad891f6a044da66d
1 parent
e2cd7368
更新demo
Showing
10 changed files
with
215 additions
and
199 deletions
commons/ConfigDB.py
@@ -2,11 +2,9 @@ | @@ -2,11 +2,9 @@ | ||
2 | # -*- coding: UTF-8 -*- | 2 | # -*- coding: UTF-8 -*- |
3 | import pymysql | 3 | import pymysql |
4 | import time | 4 | import time |
5 | -import commons.common as ca | ||
6 | import json | 5 | import json |
7 | -from commons.Logging import Logger | ||
8 | -# import chardet | ||
9 | -log=Logger() | 6 | +import commons.common as ca |
7 | +from commons.Logging import log | ||
10 | 8 | ||
11 | 9 | ||
12 | dbhost=ca.get_global_config('global_data','Database','dbhost') | 10 | dbhost=ca.get_global_config('global_data','Database','dbhost') |
commons/Faker.py
1 | -#!/usr/bin/python | ||
2 | -# -*- coding: UTF-8 -*- | ||
3 | -import random | ||
4 | -from faker import Factory | ||
5 | - | ||
6 | -class random_data(): | ||
7 | - | ||
8 | - def __init__(self, type='zh_CN'): | ||
9 | - self.type = type | ||
10 | - self.fake = Factory().create(self.type) | ||
11 | - | ||
12 | - def date(self): | ||
13 | - "随机时间" | ||
14 | - return self.fake.date(pattern="%Y-%m-%d") | ||
15 | - | ||
16 | - def name(self): | ||
17 | - "随机姓名" | ||
18 | - return self.fake.name() | ||
19 | - | ||
20 | - def identity_card(self): | ||
21 | - "随机姓名" | ||
22 | - return self.fake.ssn(min_age=18, max_age=90) | ||
23 | - | ||
24 | - def plate(self): | ||
25 | - "随机车牌号" | ||
26 | - return self.fake.license_plate() | ||
27 | - | ||
28 | - def plate_cn(self,plate_len=6): | ||
29 | - char0='京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽赣粤青藏川宁琼' | ||
30 | - char1='ABCDEFGHJKLMNPQRSTUVWXYZ'#车牌号中没有I和O,可自行百度 | ||
31 | - char2='1234567890' | ||
32 | - len0=len(char0)-1 | ||
33 | - len1 = len(char1) - 1 | ||
34 | - len2 = len(char2) - 1 | ||
35 | - ######## | ||
36 | - code = '' | ||
37 | - index0 = random.randint(0,len0 ) | ||
38 | - index1 = random.randint(0,len1) | ||
39 | - code += char0[index0] | ||
40 | - code += char1[index1] | ||
41 | - for i in range(0, plate_len-1): | ||
42 | - index2 = random.randint(1, len2) | ||
43 | - code += char2[index2] | ||
44 | - return(code) | ||
45 | - | ||
46 | - def country(self): | ||
47 | - "随机国家代码" | ||
48 | - return self.fake.country() | ||
49 | - | ||
50 | - def province(self): | ||
51 | - "随机省份" | ||
52 | - return self.fake.province() | ||
53 | - | ||
54 | - def city(self): | ||
55 | - "随机城市" | ||
56 | - return self.fake.city_suffix() | ||
57 | - | ||
58 | - def district(self): | ||
59 | - "随机街道" | ||
60 | - return self.fake.district() | ||
61 | - | ||
62 | - def address(self): | ||
63 | - "随机地址全称" | ||
64 | - return self.fake.address() | ||
65 | - | ||
66 | - def phone_number(self): | ||
67 | - "随机手机号" | ||
68 | - return self.fake.phone_number() | ||
69 | - | ||
70 | - def email(self): | ||
71 | - "随机邮件" | ||
72 | - return self.fake.email() | ||
73 | - | ||
74 | - def longitude(self): | ||
75 | - "随机经度" | ||
76 | - return self.fake.longitude() | ||
77 | - | ||
78 | - def latitude (self): | ||
79 | - "随机维度" | ||
80 | - return self.fake.latitude () | ||
81 | - | ||
82 | - def credit_card_number (self): | ||
83 | - "随机卡号" | ||
84 | - return self.fake.credit_card_number () | ||
85 | - | ||
86 | - | ||
87 | - | ||
88 | -a=random_data() | ||
89 | -print(a.date()) | ||
90 | -print(a.name()) | ||
91 | -print(a.identity_card()) | ||
92 | -print(a.plate()) | ||
93 | -print(a.plate_cn(6)) | ||
94 | -print(a.country()) | ||
95 | -print(a.province()) | ||
96 | -print(a.city()) | ||
97 | -print(a.district()) | ||
98 | -print(a.address()) | ||
99 | -print(a.phone_number()) | ||
100 | -print(a.email()) | ||
101 | -print(a.longitude()) | ||
102 | -print(a.latitude()) | ||
103 | -print(a.credit_card_number()) | ||
104 | - | 1 | +#!/usr/bin/python |
2 | +# -*- coding: UTF-8 -*- | ||
3 | +import random | ||
4 | +from faker import Factory | ||
5 | + | ||
6 | +class random_data(): | ||
7 | + | ||
8 | + def __init__(self, type='zh_CN'): | ||
9 | + self.type = type | ||
10 | + self.fake = Factory().create(self.type) | ||
11 | + | ||
12 | + def date(self): | ||
13 | + "随机时间" | ||
14 | + return self.fake.date(pattern="%Y-%m-%d") | ||
15 | + | ||
16 | + def name(self): | ||
17 | + "随机姓名" | ||
18 | + return self.fake.name() | ||
19 | + | ||
20 | + def identity_card(self): | ||
21 | + "随机证件" | ||
22 | + return self.fake.ssn(min_age=18, max_age=90) | ||
23 | + | ||
24 | + def plate(self): | ||
25 | + "随机车牌号" | ||
26 | + return self.fake.license_plate() | ||
27 | + | ||
28 | + def plate_cn(self,plate_len=6): | ||
29 | + "随机车牌号" | ||
30 | + char0='京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽赣粤青藏川宁琼' | ||
31 | + char1='ABCDEFGHJKLMNPQRSTUVWXYZ'#车牌号中没有I和O,可自行百度 | ||
32 | + char2='1234567890' | ||
33 | + len0=len(char0)-1 | ||
34 | + len1 = len(char1) - 1 | ||
35 | + len2 = len(char2) - 1 | ||
36 | + ######## | ||
37 | + code = '' | ||
38 | + index0 = random.randint(0,len0 ) | ||
39 | + index1 = random.randint(0,len1) | ||
40 | + code += char0[index0] | ||
41 | + code += char1[index1] | ||
42 | + for i in range(0, plate_len-1): | ||
43 | + index2 = random.randint(1, len2) | ||
44 | + code += char2[index2] | ||
45 | + return(code) | ||
46 | + | ||
47 | + def country(self): | ||
48 | + "随机国家代码" | ||
49 | + return self.fake.country() | ||
50 | + | ||
51 | + def province(self): | ||
52 | + "随机省份" | ||
53 | + return self.fake.province() | ||
54 | + | ||
55 | + def city(self): | ||
56 | + "随机城市" | ||
57 | + return self.fake.city_suffix() | ||
58 | + | ||
59 | + def district(self): | ||
60 | + "随机街道" | ||
61 | + return self.fake.district() | ||
62 | + | ||
63 | + def address(self): | ||
64 | + "随机地址全称" | ||
65 | + return self.fake.address() | ||
66 | + | ||
67 | + def phone_number(self): | ||
68 | + "随机手机号" | ||
69 | + return self.fake.phone_number() | ||
70 | + | ||
71 | + def email(self): | ||
72 | + "随机邮件" | ||
73 | + return self.fake.email() | ||
74 | + | ||
75 | + def longitude(self): | ||
76 | + "随机经度" | ||
77 | + return self.fake.longitude() | ||
78 | + | ||
79 | + def latitude (self): | ||
80 | + "随机维度" | ||
81 | + return self.fake.latitude () | ||
82 | + | ||
83 | + def credit_card_number (self): | ||
84 | + "随机卡号" | ||
85 | + return self.fake.credit_card_number () | ||
86 | + | ||
87 | + | ||
88 | + | ||
89 | +# a=random_data() | ||
90 | +# print(a.date()) | ||
91 | +# print(a.name()) | ||
92 | +# print(a.identity_card()) | ||
93 | +# print(a.plate()) | ||
94 | +# print(a.plate_cn(6)) | ||
95 | +# print(a.country()) | ||
96 | +# print(a.province()) | ||
97 | +# print(a.city()) | ||
98 | +# print(a.district()) | ||
99 | +# print(a.address()) | ||
100 | +# print(a.phone_number()) | ||
101 | +# print(a.email()) | ||
102 | +# print(a.longitude()) | ||
103 | +# print(a.latitude()) | ||
104 | +# print(a.credit_card_number()) | ||
105 | + |
commons/Logging.py
1 | #!/usr/bin/python | 1 | #!/usr/bin/python |
2 | # -*- coding: UTF-8 -*- | 2 | # -*- coding: UTF-8 -*- |
3 | import logging,os | 3 | import logging,os |
4 | +# from mylog import mylogger,logg | ||
5 | + | ||
4 | 6 | ||
5 | class Logger(): | 7 | class Logger(): |
6 | 8 | ||
7 | def __init__(self, path=__name__,clevel = logging.ERROR,Flevel = logging.DEBUG,test = 'w'): | 9 | def __init__(self, path=__name__,clevel = logging.ERROR,Flevel = logging.DEBUG,test = 'w'): |
8 | current_path=os.path.dirname(os.path.dirname(__file__)) | 10 | current_path=os.path.dirname(os.path.dirname(__file__)) |
9 | path=current_path+"/report"+"/test.log" | 11 | path=current_path+"/report"+"/test.log" |
12 | + # setattr(mylogger, "logpath", path) | ||
13 | + # logg.setting() | ||
10 | 14 | ||
11 | self.logger = logging.getLogger(path) | 15 | self.logger = logging.getLogger(path) |
12 | 16 | ||
@@ -55,3 +59,6 @@ class Logger(): | @@ -55,3 +59,6 @@ class Logger(): | ||
55 | def critical(self,message): | 59 | def critical(self,message): |
56 | 60 | ||
57 | self.logger.critical(message) | 61 | self.logger.critical(message) |
62 | + | ||
63 | + | ||
64 | +log=Logger() | ||
58 | \ No newline at end of file | 65 | \ No newline at end of file |
commons/MySession.py
@@ -2,12 +2,12 @@ | @@ -2,12 +2,12 @@ | ||
2 | # -*- coding: UTF-8 -*- | 2 | # -*- coding: UTF-8 -*- |
3 | import requests | 3 | import requests |
4 | from commons import common as com | 4 | from commons import common as com |
5 | -from commons.Logging import Logger | 5 | +from commons.Logging import log |
6 | from commons.clientSession import cliSession | 6 | from commons.clientSession import cliSession |
7 | from commons.scripts.pwdCry import pwdCry | 7 | from commons.scripts.pwdCry import pwdCry |
8 | -log=Logger() | ||
9 | 8 | ||
10 | -class mysession(): | 9 | + |
10 | +class mysession(requests.Session): | ||
11 | "封装了requests的基类,以供后期统一使用" | 11 | "封装了requests的基类,以供后期统一使用" |
12 | 12 | ||
13 | url = "http://test.uap.diligrp.com/login/login.action" | 13 | url = "http://test.uap.diligrp.com/login/login.action" |
@@ -38,24 +38,28 @@ class mysession(): | @@ -38,24 +38,28 @@ class mysession(): | ||
38 | 38 | ||
39 | def __init__(self): | 39 | def __init__(self): |
40 | "如下代码,可以通过配置文件来控制测试环境和灰度环境,http和https" | 40 | "如下代码,可以通过配置文件来控制测试环境和灰度环境,http和https" |
41 | + super().__init__() | ||
41 | self.url = mysession.url.replace("http://test.", com.get_global_config("global_data", "environment", "en")) | 42 | self.url = mysession.url.replace("http://test.", com.get_global_config("global_data", "environment", "en")) |
42 | self.header = mysession.header | 43 | self.header = mysession.header |
43 | self.body = mysession.body | 44 | self.body = mysession.body |
44 | self.url_client = mysession.url_client.replace("http://test.", com.get_global_config("global_data", "environment", "en")) | 45 | self.url_client = mysession.url_client.replace("http://test.", com.get_global_config("global_data", "environment", "en")) |
45 | self.header_client = mysession.header_client | 46 | self.header_client = mysession.header_client |
46 | self.body_client = mysession.body_client | 47 | self.body_client = mysession.body_client |
47 | - self.timeout = (5, 5) | 48 | + self.timeout = (6,6) |
48 | self.max_retries = 3 | 49 | self.max_retries = 3 |
49 | self.keep_alive = False | 50 | self.keep_alive = False |
50 | self.ssl_verify = False | 51 | self.ssl_verify = False |
51 | self.proxies = None | 52 | self.proxies = None |
52 | # self.proxies={'http': 'http://localhost:8888', 'https': 'http://localhost:8888'} | 53 | # self.proxies={'http': 'http://localhost:8888', 'https': 'http://localhost:8888'} |
54 | + self.myproxies={'http': 'http://localhost:8888', 'https': 'http://localhost:8888'} | ||
53 | self.allow_redirects = False | 55 | self.allow_redirects = False |
54 | self.firmid={"group":"1","hd":"2","cd":"3","qqhe":"4","mdj":"5","gy":"6","cc":"7","sg":"8","sy":"9"} | 56 | self.firmid={"group":"1","hd":"2","cd":"3","qqhe":"4","mdj":"5","gy":"6","cc":"7","sg":"8","sy":"9"} |
57 | + self.market={"sy":"沈阳","heb":"哈尔滨","sg":"寿光","gy":"贵阳","cc":"长春","hs":"杭水","hg":"杭果"} | ||
58 | + self.user={} | ||
55 | 59 | ||
56 | - | ||
57 | - def cliLogin(self): | ||
58 | - self.webHeaders, self.clientHeaders, self.userInfo = cliSession().loginUser() | 60 | + def cliLogin(self,user="sy_userName_01"): |
61 | + self.webHeaders, self.clientHeaders, self.userInfo = cliSession().loginUser(user=user) | ||
62 | + return self | ||
59 | 63 | ||
60 | def get_session(self, account, **kwargs): | 64 | def get_session(self, account, **kwargs): |
61 | "如下代码,可以通过配置文件来控制登录的账户session" | 65 | "如下代码,可以通过配置文件来控制登录的账户session" |
@@ -63,69 +67,53 @@ class mysession(): | @@ -63,69 +67,53 @@ class mysession(): | ||
63 | com.get_global_config("global_data", "account", account).split("&")[0]) | 67 | com.get_global_config("global_data", "account", account).split("&")[0]) |
64 | self.body = self.body.replace("111111", | 68 | self.body = self.body.replace("111111", |
65 | com.get_global_config("global_data", "account", account).split("&")[1]) | 69 | com.get_global_config("global_data", "account", account).split("&")[1]) |
66 | - # requests.session()会话保持,比如使用session成功的登录了某个网站, | ||
67 | - # 则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数 | ||
68 | self.se = requests.session() | 70 | self.se = requests.session() |
69 | - #更新cookie加入UAP_firmId | ||
70 | co = requests.cookies.RequestsCookieJar() | 71 | co = requests.cookies.RequestsCookieJar() |
71 | - #backup:通过提前配置的方法更新市场id | 72 | + #加入UAP_firmId属性 |
72 | firm=account.split("_")[0] | 73 | firm=account.split("_")[0] |
73 | co.set("UAP_firmId", self.firmid[firm]) | 74 | co.set("UAP_firmId", self.firmid[firm]) |
74 | - #通过客户端登录的方法更新市场id | ||
75 | - # co.set("UAP_firmId", str(self.get_login_info(account).json()["data"]["user"]["firmId"])) | ||
76 | self.se.cookies.update(co) | 75 | self.se.cookies.update(co) |
77 | - # 使用session对象的方法POST/GET等 | 76 | + # 进行登录请求 |
78 | re = self.se.post(url=self.url, headers=self.header, data=self.body, proxies=self.proxies, **kwargs) | 77 | re = self.se.post(url=self.url, headers=self.header, data=self.body, proxies=self.proxies, **kwargs) |
79 | - #获取关键信息供其他接口header使用 | ||
80 | self.UAP_accessToken=self.se.cookies["UAP_accessToken"] | 78 | self.UAP_accessToken=self.se.cookies["UAP_accessToken"] |
81 | self.UAP_refreshToken=self.se.cookies["UAP_refreshToken"] | 79 | self.UAP_refreshToken=self.se.cookies["UAP_refreshToken"] |
82 | - # 返回session对象,供其他接口使用 | ||
83 | return self.se | 80 | return self.se |
84 | 81 | ||
85 | def get_login_info(self, account, **kwargs): | 82 | def get_login_info(self, account, **kwargs): |
86 | "用于获取用户信息" | 83 | "用于获取用户信息" |
87 | self.body_client.update({"userName":com.get_global_config("global_data", "account", account).split("&")[0]}) | 84 | self.body_client.update({"userName":com.get_global_config("global_data", "account", account).split("&")[0]}) |
88 | self.body_client.update({"password":pwdCry(com.get_global_config("global_data", "account", account).split("&")[1])}) | 85 | self.body_client.update({"password":pwdCry(com.get_global_config("global_data", "account", account).split("&")[1])}) |
89 | - # requests.session()会话保持,比如使用session成功的登录了某个网站, | ||
90 | - # 则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数 | ||
91 | tmp = requests.post(url=self.url_client, headers=self.header_client, json=self.body_client, proxies=self.proxies, **kwargs) | 86 | tmp = requests.post(url=self.url_client, headers=self.header_client, json=self.body_client, proxies=self.proxies, **kwargs) |
92 | - # 使用session对象的方法POST/GET等 | ||
93 | - #获取关键信息供其他接口header使用 | ||
94 | - # self.UAP_accessToken=tmp.json()["data"]["accessToken"] | ||
95 | - # self.UAP_refreshToken=tmp.json()["data"]["refreshToken"] | ||
96 | - # 返回session对象,供其他接口使用 | ||
97 | return tmp | 87 | return tmp |
98 | 88 | ||
99 | def get_session_client(self, account, **kwargs): | 89 | def get_session_client(self, account, **kwargs): |
100 | "get_session和get_session_client的方法只能用一个" | 90 | "get_session和get_session_client的方法只能用一个" |
101 | self.body_client.update({"userName": com.get_global_config("global_data", "account", account).split("&")[0]}) | 91 | self.body_client.update({"userName": com.get_global_config("global_data", "account", account).split("&")[0]}) |
102 | self.body_client.update( {"password": pwdCry(com.get_global_config("global_data", "account", account).split("&")[1])}) | 92 | self.body_client.update( {"password": pwdCry(com.get_global_config("global_data", "account", account).split("&")[1])}) |
103 | - # requests.session()会话保持,比如使用session成功的登录了某个网站, | ||
104 | - # 则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数 | ||
105 | - self.se = requests.session() | ||
106 | - # 使用session对象的方法POST/GET等 | ||
107 | - self.re = self.se.post(url=self.url_client, headers=self.header_client, json=self.body_client, proxies=self.proxies, **kwargs) | ||
108 | - #组装请求的cookie | 93 | + # 登录请求 |
94 | + self.re = super().post(url=self.url_client, headers=self.header_client, json=self.body_client, **kwargs) | ||
95 | + #冗余登录账户信息 | ||
96 | + self.user[account]=self.re.json()["data"]["user"] | ||
97 | + #配置cookie | ||
109 | co = requests.cookies.RequestsCookieJar() | 98 | co = requests.cookies.RequestsCookieJar() |
110 | - co.set("UAP_firmId", str(self.re.json()["data"]["user"]["firmId"])) | ||
111 | - co.set("UAP_accessToken", self.re.json()["data"]["accessToken"]) | ||
112 | - co.set("UAP_refreshToken", self.re.json()["data"]["refreshToken"]) | ||
113 | - self.se.cookies.update(co) | ||
114 | - # 返回session对象,供其他接口使用 | ||
115 | - return self.se | ||
116 | - | 99 | + co.set("UAP_firmId", str(self.re.json()["data"]["user"]["firmId"]),domain=".diligrp.com") |
100 | + co.set("UAP_accessToken", self.re.json()["data"]["accessToken"],domain=".diligrp.com") | ||
101 | + co.set("UAP_refreshToken", self.re.json()["data"]["refreshToken"],domain=".diligrp.com") | ||
102 | + self.cookies.update(co) | ||
103 | + return self | ||
117 | 104 | ||
118 | def close_session(self): | 105 | def close_session(self): |
119 | "关闭session" | 106 | "关闭session" |
120 | - self.se.close() | 107 | + self.close() |
121 | 108 | ||
122 | def check_login(self, account, **kwargs): | 109 | def check_login(self, account, **kwargs): |
123 | "验证登录接口" | 110 | "验证登录接口" |
124 | self.body = self.body.replace("sg_wenze", | 111 | self.body = self.body.replace("sg_wenze", |
125 | com.get_global_config("global_data", "account", account).split("&")[0]) | 112 | com.get_global_config("global_data", "account", account).split("&")[0]) |
126 | self.body = self.body.replace("111111", com.get_global_config("global_data", "account", account).split("&")[1]) | 113 | self.body = self.body.replace("111111", com.get_global_config("global_data", "account", account).split("&")[1]) |
127 | - # POST请求, | ||
128 | - re = self.se.post(url=self.url, headers=self.header, data=self.body, proxies=self.proxies, | 114 | + # POST请求 |
115 | + print(self.body) | ||
116 | + re = super().post(url=self.url, headers=self.header, data=self.body.encode('utf-8'), | ||
129 | allow_redirects=False, **kwargs) | 117 | allow_redirects=False, **kwargs) |
130 | # 判断请求 | 118 | # 判断请求 |
131 | assert "UAP_accessToken" in re.headers["Set-Cookie"] | 119 | assert "UAP_accessToken" in re.headers["Set-Cookie"] |
@@ -165,7 +153,7 @@ class mysession(): | @@ -165,7 +153,7 @@ class mysession(): | ||
165 | log.info("{0:=^86}".format('')) | 153 | log.info("{0:=^86}".format('')) |
166 | log.info("{}\n{}\n".format(url, kwargs)) | 154 | log.info("{}\n{}\n".format(url, kwargs)) |
167 | # 进行请求 | 155 | # 进行请求 |
168 | - re = self.se.request(method , url, **kwargs, proxies=self.proxies, timeout=self.timeout) | 156 | + re = super().request(method , url, **kwargs,timeout=self.timeout) |
169 | return re | 157 | return re |
170 | 158 | ||
171 | 159 | ||
@@ -176,11 +164,8 @@ class mysession(): | @@ -176,11 +164,8 @@ class mysession(): | ||
176 | :param \*\*kwargs: Optional arguments that ``request`` takes. | 164 | :param \*\*kwargs: Optional arguments that ``request`` takes. |
177 | :rtype: requests.Response | 165 | :rtype: requests.Response |
178 | """ | 166 | """ |
179 | - # 记录日志 | ||
180 | - log.info("{0:=^86}".format('')) | ||
181 | - log.info("{}\n{}\n".format(url, kwargs)) | ||
182 | # 进行请求 | 167 | # 进行请求 |
183 | - re = self.se.get(url, **kwargs, proxies=self.proxies, timeout=self.timeout) | 168 | + re = super().get(url, **kwargs) |
184 | return re | 169 | return re |
185 | 170 | ||
186 | def post(self, url, data=None, json=None, **kwargs): | 171 | def post(self, url, data=None, json=None, **kwargs): |
@@ -192,11 +177,8 @@ class mysession(): | @@ -192,11 +177,8 @@ class mysession(): | ||
192 | :param \*\*kwargs: Optional arguments that ``request`` takes. | 177 | :param \*\*kwargs: Optional arguments that ``request`` takes. |
193 | :rtype: requests.Response | 178 | :rtype: requests.Response |
194 | """ | 179 | """ |
195 | - # 记录日志 | ||
196 | - log.info("{0:=^86}".format('')) | ||
197 | - log.info("{}\n{}\n{}\n{}".format(url, data, json, kwargs)) | ||
198 | # 进行请求 | 180 | # 进行请求 |
199 | - re = self.se.post(url, data=data, json=json, proxies=self.proxies, **kwargs, timeout=self.timeout) | 181 | + re = super().post(url, data=data, json=json, **kwargs) |
200 | return re | 182 | return re |
201 | 183 | ||
202 | def options(self, url, **kwargs): | 184 | def options(self, url, **kwargs): |
@@ -280,12 +262,15 @@ class mysession(): | @@ -280,12 +262,15 @@ class mysession(): | ||
280 | 262 | ||
281 | my = mysession() | 263 | my = mysession() |
282 | my.set_mark() | 264 | my.set_mark() |
283 | -my.cliLogin() | ||
284 | -s1 = my.get_session_client("sg_user01") | ||
285 | -s2 = my.get_session_client("sg_user02") | ||
286 | -s3 = my.get_session_client("sg_user01") | ||
287 | -# s3= my.get_session_client("sg_user02") | ||
288 | -# sg01=my.get_session_client("sg_user01") | ||
289 | -# sg02=my.get_session_client("sg_user02") | ||
290 | -# sy=my.get_session_client("sy_user01") | 265 | + |
266 | +# 沈阳客户端session | ||
267 | +sessionSy = mysession().cliLogin("sy_userName_01") | ||
268 | +# 哈尔滨客户端session | ||
269 | +sessionHeb = mysession().cliLogin("hd_userName_01") | ||
270 | +# print(sessionSy.userInfo) | ||
271 | +# print(sessionHeb.userInfo) | ||
272 | + | ||
273 | +sy1=mysession().get_session_client("sy_user01") | ||
274 | +heb=mysession().get_session_client("heb_user01") | ||
275 | +# sg=mysession().get_session_client("sg_user01") | ||
291 | 276 |
commons/SendEmail.py
@@ -7,8 +7,7 @@ from email.header import Header | @@ -7,8 +7,7 @@ from email.header import Header | ||
7 | from email.mime.text import MIMEText | 7 | from email.mime.text import MIMEText |
8 | from email.mime.image import MIMEImage | 8 | from email.mime.image import MIMEImage |
9 | from email.mime.application import MIMEApplication | 9 | from email.mime.application import MIMEApplication |
10 | -from commons.Logging import Logger | ||
11 | -log=Logger() | 10 | +from commons.Logging import log |
12 | 11 | ||
13 | def send_email_text(): | 12 | def send_email_text(): |
14 | # 1. 编写邮件内容(Email邮件需要专门的MIME格式) | 13 | # 1. 编写邮件内容(Email邮件需要专门的MIME格式) |
@@ -26,14 +25,16 @@ def send_email_text(): | @@ -26,14 +25,16 @@ def send_email_text(): | ||
26 | smtp.quit() | 25 | smtp.quit() |
27 | 26 | ||
28 | 27 | ||
29 | -def send_email(send_file,send_to=["lixi@diligrp.com"]): | 28 | +def send_email(send_file,send_to=["lixi@diligrp.com"],cc_to=["lixi@diligrp.com"]): |
30 | 29 | ||
31 | log_path=os.path.dirname(os.path.dirname(__file__)) | 30 | log_path=os.path.dirname(os.path.dirname(__file__)) |
32 | log_path=log_path+"/report/test.log" | 31 | log_path=log_path+"/report/test.log" |
33 | send_msg=(",".join(str(i) for i in send_to)) | 32 | send_msg=(",".join(str(i) for i in send_to)) |
33 | + cc_msg = (",".join(str(j) for j in cc_to)) | ||
34 | msg = MIMEMultipart() # 混合MIME格式 | 34 | msg = MIMEMultipart() # 混合MIME格式 |
35 | msg['From'] = 'autotest@diligrp.com' # 发件人 | 35 | msg['From'] = 'autotest@diligrp.com' # 发件人 |
36 | msg['To'] = send_msg # 收件人 | 36 | msg['To'] = send_msg # 收件人 |
37 | + msg['cc'] = cc_msg # 抄送人 | ||
37 | msg['Subject'] = Header('接口测试报告', 'utf-8') # 中文邮件主题,指定utf-8编码 | 38 | msg['Subject'] = Header('接口测试报告', 'utf-8') # 中文邮件主题,指定utf-8编码 |
38 | 39 | ||
39 | text = MIMEText('this is a test email', 'plain', 'utf-8') | 40 | text = MIMEText('this is a test email', 'plain', 'utf-8') |
@@ -54,7 +55,7 @@ def send_email(send_file,send_to=["lixi@diligrp.com"]): | @@ -54,7 +55,7 @@ def send_email(send_file,send_to=["lixi@diligrp.com"]): | ||
54 | try: | 55 | try: |
55 | smtp = smtplib.SMTP_SSL('smtp.exmail.qq.com') # smtp服务器地址 使用SSL模式 | 56 | smtp = smtplib.SMTP_SSL('smtp.exmail.qq.com') # smtp服务器地址 使用SSL模式 |
56 | re=smtp.login('autotest@diligrp.com', 'MvkuGGCfMtAdbJvE') # 用户名和密码 | 57 | re=smtp.login('autotest@diligrp.com', 'MvkuGGCfMtAdbJvE') # 用户名和密码 |
57 | - smtp.sendmail("autotest@diligrp.com", send_to, msg.as_string()) | 58 | + smtp.sendmail("autotest@diligrp.com", send_to+cc_to, msg.as_string()) |
58 | print(re) | 59 | print(re) |
59 | except Exception as e: | 60 | except Exception as e: |
60 | log.error(str(e)) | 61 | log.error(str(e)) |
commons/clientSession.py
@@ -16,29 +16,27 @@ from commons.scripts.pwdCry import pwdCry | @@ -16,29 +16,27 @@ from commons.scripts.pwdCry import pwdCry | ||
16 | 16 | ||
17 | class cliSession(object): | 17 | class cliSession(object): |
18 | def __init__(self): | 18 | def __init__(self): |
19 | - rConf = readConfig() | ||
20 | - | ||
21 | - def __init__(self): | ||
22 | - rC = readConfig() | ||
23 | - self.userName = rC.returnOptionsItems("loginInfo","userName") | ||
24 | - self.password = pwdCry(rC.returnOptionsItems("loginInfo","password")) | ||
25 | - self.loginUrl = rC.returnOptionsItems("host","uapHost")+"/api/authenticationApi/loginWeb" | ||
26 | - self.loginData = {"userName":self.userName,"password":self.password} | 19 | + self.rC = readConfig() |
27 | self.webHeaders = {"X-Requested-With":"XMLHttpRequest", | 20 | self.webHeaders = {"X-Requested-With":"XMLHttpRequest", |
28 | "Content-Type":"application/x-www-form-urlencoded", | 21 | "Content-Type":"application/x-www-form-urlencoded", |
29 | "Cookie":"UAP_accessToken=${UAP_accessToken}; UAP_refreshToken=${UAP_refreshToken};UAP_firmId=${UAP_firmId}"} | 22 | "Cookie":"UAP_accessToken=${UAP_accessToken}; UAP_refreshToken=${UAP_refreshToken};UAP_firmId=${UAP_firmId}"} |
30 | - | ||
31 | self.clientHeaders={"UAP_accessToken":"${UAP_accessToken}", | 23 | self.clientHeaders={"UAP_accessToken":"${UAP_accessToken}", |
32 | "UAP_refreshToken":"${UAP_refreshToken}", | 24 | "UAP_refreshToken":"${UAP_refreshToken}", |
33 | "UAP_firmId":"${UAP_firmId}", | 25 | "UAP_firmId":"${UAP_firmId}", |
34 | "Cookie":"UAP_accessToken=${UAP_accessToken}; UAP_refreshToken=${UAP_refreshToken}", | 26 | "Cookie":"UAP_accessToken=${UAP_accessToken}; UAP_refreshToken=${UAP_refreshToken}", |
35 | "Content-Type":"application/json"} | 27 | "Content-Type":"application/json"} |
36 | 28 | ||
37 | - def loginUser(self): | ||
38 | - """ | ||
39 | 29 | ||
30 | + def loginUser(self,user="sy_userName_01"): | ||
31 | + """ | ||
40 | :return: | 32 | :return: |
41 | """ | 33 | """ |
34 | + # 登录信息准备 | ||
35 | + self.userName,self.password = self.rC.returnOptionsItems("loginInfo",user).split(",") | ||
36 | + self.password = pwdCry(self.password) | ||
37 | + self.loginUrl = self.rC.returnOptionsItems("host","uapHost")+"/api/authenticationApi/loginWeb" | ||
38 | + self.loginData = {"userName":self.userName,"password":self.password} | ||
39 | + | ||
42 | # 返回登录信息,以及可用headers,clientHeaders用户客户端操作header,webHeaders用于web页面使用headers | 40 | # 返回登录信息,以及可用headers,clientHeaders用户客户端操作header,webHeaders用于web页面使用headers |
43 | res = requests.post(url=self.loginUrl,data=json.dumps(self.loginData)) | 41 | res = requests.post(url=self.loginUrl,data=json.dumps(self.loginData)) |
44 | # print(res.json()) | 42 | # print(res.json()) |
@@ -51,3 +49,6 @@ class cliSession(object): | @@ -51,3 +49,6 @@ class cliSession(object): | ||
51 | self.clientHeaders["UAP_firmId"] = str(UAP_firmId) | 49 | self.clientHeaders["UAP_firmId"] = str(UAP_firmId) |
52 | self.clientHeaders["Cookie"] = clientHeadersCookie | 50 | self.clientHeaders["Cookie"] = clientHeadersCookie |
53 | return self.webHeaders,self.clientHeaders,res.json() | 51 | return self.webHeaders,self.clientHeaders,res.json() |
52 | + | ||
53 | +# a,b,c = cliSession().loginUser() | ||
54 | +# print(c) | ||
54 | \ No newline at end of file | 55 | \ No newline at end of file |
commons/common.py
@@ -4,8 +4,7 @@ import os | @@ -4,8 +4,7 @@ import os | ||
4 | import configparser | 4 | import configparser |
5 | import unittest | 5 | import unittest |
6 | from discover import DiscoveringTestLoader | 6 | from discover import DiscoveringTestLoader |
7 | -from commons.Logging import Logger | ||
8 | -log=Logger() | 7 | +from commons.Logging import log |
9 | 8 | ||
10 | 9 | ||
11 | def get_global_config(file,section, key): | 10 | def get_global_config(file,section, key): |
@@ -83,11 +82,15 @@ def run_one(name): | @@ -83,11 +82,15 @@ def run_one(name): | ||
83 | runner = unittest.TextTestRunner() | 82 | runner = unittest.TextTestRunner() |
84 | runner.run(test_suite) | 83 | runner.run(test_suite) |
85 | 84 | ||
85 | + | ||
86 | def run_list(name): | 86 | def run_list(name): |
87 | test_suite = unittest.TestSuite() | 87 | test_suite = unittest.TestSuite() |
88 | test_suite.addTests(name) | 88 | test_suite.addTests(name) |
89 | #显示运行用例 | 89 | #显示运行用例 |
90 | print("运行用例为{}".format(test_suite)) | 90 | print("运行用例为{}".format(test_suite)) |
91 | + # with open(file="E:\\PycharmWorkspace\\jmsf-re-local\\report\\test.log", mode="a", encoding="utf-8") as file: | ||
92 | + # runner = unittest.TextTestRunner(stream=file,verbosity=2) | ||
93 | + # runner.run(test_suite) | ||
91 | runner = unittest.TextTestRunner() | 94 | runner = unittest.TextTestRunner() |
92 | runner.run(test_suite) | 95 | runner.run(test_suite) |
93 | 96 | ||
@@ -112,4 +115,8 @@ def run_Name(name): | @@ -112,4 +115,8 @@ def run_Name(name): | ||
112 | runner = unittest.TextTestRunner() | 115 | runner = unittest.TextTestRunner() |
113 | runner.run(test_cases) | 116 | runner.run(test_cases) |
114 | 117 | ||
115 | -# print(get_market_config("test_config_hg2","loginInfo","userName")) | ||
116 | \ No newline at end of file | 118 | \ No newline at end of file |
119 | +def mylog(func): | ||
120 | + def RebackTest(self): | ||
121 | + log.info("{}".format(func.__name__)) | ||
122 | + return func(self) | ||
123 | + return RebackTest | ||
117 | \ No newline at end of file | 124 | \ No newline at end of file |
commons/scripts/dealContentType.py
@@ -9,10 +9,10 @@ | @@ -9,10 +9,10 @@ | ||
9 | 用于hearders中Content-Type格式处理 | 9 | 用于hearders中Content-Type格式处理 |
10 | """ | 10 | """ |
11 | 11 | ||
12 | -def jsonCT(headers=None): | 12 | +def jsonCode(headers={}): |
13 | headers["Content-Type"] = "application/json; charset=UTF-8" | 13 | headers["Content-Type"] = "application/json; charset=UTF-8" |
14 | return headers | 14 | return headers |
15 | 15 | ||
16 | -def urlCode(headers=None): | 16 | +def urlCode(headers={}): |
17 | headers["Content-Type"] = "application/x-www-form-urlencoded" | 17 | headers["Content-Type"] = "application/x-www-form-urlencoded" |
18 | return headers | 18 | return headers |
19 | \ No newline at end of file | 19 | \ No newline at end of file |
commons/scripts/readConf.py
@@ -19,7 +19,7 @@ class readConfig(object): | @@ -19,7 +19,7 @@ class readConfig(object): | ||
19 | # 按市场读取配置文件数据 | 19 | # 按市场读取配置文件数据 |
20 | self.conf = configparser.ConfigParser() | 20 | self.conf = configparser.ConfigParser() |
21 | self.evn_name = os.name | 21 | self.evn_name = os.name |
22 | - self.file_name = r'test_config_hg.conf' | 22 | + self.file_name = r'conf_test.conf' |
23 | self.relative_path = r'/config/marketConfig/' | 23 | self.relative_path = r'/config/marketConfig/' |
24 | self.file_path = os.path.abspath( | 24 | self.file_path = os.path.abspath( |
25 | os.path.join(os.path.dirname(__file__), "../../")) + self.relative_path + self.file_name | 25 | os.path.join(os.path.dirname(__file__), "../../")) + self.relative_path + self.file_name |
@@ -53,7 +53,7 @@ class readConfig(object): | @@ -53,7 +53,7 @@ class readConfig(object): | ||
53 | print(self.file_path) | 53 | print(self.file_path) |
54 | return self.file_path | 54 | return self.file_path |
55 | 55 | ||
56 | -# rc = readConfig() | 56 | +rC = readConfig() |
57 | # rc.returnSections() | 57 | # rc.returnSections() |
58 | # rc.returnOptions("loginInfo") | 58 | # rc.returnOptions("loginInfo") |
59 | # rc.returnOptionsInfo("loginInfo") | 59 | # rc.returnOptionsInfo("loginInfo") |
config/global_data.conf
1 | # -*- coding: UTF-8 -*- | 1 | # -*- coding: UTF-8 -*- |
2 | 2 | ||
3 | +[market] | ||
4 | +#该字段存放市场的缩略名称,运行指定市场的用例,目前为着冗余配置 | ||
5 | +#list为空时,默认运行所有市场用例,需要指定市场时,参考demo格式 | ||
6 | +list=[] | ||
7 | +demo=["sy","heb"] | ||
8 | + | ||
3 | [account] | 9 | [account] |
4 | #取值字段根据市场拼音首字母缩写组合而成,尾号数字按照01-99叠加 | 10 | #取值字段根据市场拼音首字母缩写组合而成,尾号数字按照01-99叠加 |
5 | #账户和密码通过&符号隔开 | 11 | #账户和密码通过&符号隔开 |
12 | +sy_user01=sy_chen&123456 | ||
13 | +sy_user02=sygangda&111111 | ||
14 | +heb_user01=哈尔滨田太子&a123456 | ||
15 | +heb_user02=sy_wenze&111111 | ||
6 | sg_user01=sg_wenze&111111 | 16 | sg_user01=sg_wenze&111111 |
7 | -sg_user02=sgwanggang&111111 | ||
8 | -sg_user03=hz_wenze&111111 | ||
9 | -sy_user01=sy_wenze&111111 | ||
10 | 17 | ||
11 | [userId] | 18 | [userId] |
12 | #冗余配置字段,可不配置 | 19 | #冗余配置字段,可不配置 |
@@ -16,21 +23,15 @@ user03=256 | @@ -16,21 +23,15 @@ user03=256 | ||
16 | 23 | ||
17 | [email] | 24 | [email] |
18 | #为空时[]不发邮件,若要发邮件,参考demo | 25 | #为空时[]不发邮件,若要发邮件,参考demo |
19 | -list=["lixi@diligrp.com","175930106@qq.com"] | ||
20 | -demo=["tg@diligrp.com","175930106@qq.com"] | 26 | +to_list=["tianlichang@diligrp.com","liaokaihua@diligrp.com"] |
27 | +cc_list=["lixi@diligrp.com","liujiqiang@diligrp.com","wenleiming@diligrp.com"] | ||
28 | +demo=["lixi@diligrp.com","liujiqiang@diligrp.com","wenleiming@diligrp.com","tg@diligrp.com"] | ||
21 | 29 | ||
22 | [mark] | 30 | [mark] |
23 | #为空时[]运行所有用例,若要运行指定用例,参考demo | 31 | #为空时[]运行所有用例,若要运行指定用例,参考demo |
24 | list=[] | 32 | list=[] |
25 | -demo=["p1","P2",1,"test"] | 33 | +demo=["heb1","P3","v1.6","沈阳",None] |
26 | 34 | ||
27 | -[Database] | ||
28 | -dbhost=10.35.100.34 | ||
29 | -dbport=3306 | ||
30 | -dbname=dili_trace | ||
31 | -dbuser=root | ||
32 | -dbpassword=123456 | ||
33 | -dbcharset=utf8 | ||
34 | 35 | ||
35 | [environment] | 36 | [environment] |
36 | #格式只能为一下几种 | 37 | #格式只能为一下几种 |
@@ -41,6 +42,21 @@ dbcharset=utf8 | @@ -41,6 +42,21 @@ dbcharset=utf8 | ||
41 | en=http://test. | 42 | en=http://test. |
42 | 43 | ||
43 | 44 | ||
45 | +[Database] | ||
46 | +dbhost=10.35.100.34 | ||
47 | +dbport=3306 | ||
48 | +dbname=dili_jmsf | ||
49 | +dbuser=root | ||
50 | +dbpassword=123456 | ||
51 | +dbcharset=utf8 | ||
52 | + | ||
53 | + | ||
54 | +[host] | ||
55 | +gateway=test.gateway.diligrp.com:8285 | ||
56 | + | ||
57 | + | ||
58 | + | ||
59 | + | ||
44 | 60 | ||
45 | 61 | ||
46 | 62 |