From 8fa1d8aab592789d5d81bfee1e7b0fa6a2b4899d Mon Sep 17 00:00:00 2001 From: JoeEmp <2057567309@qq.com> Date: Thu, 26 Aug 2021 19:16:51 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frame/AbFaker/fakerData.py | 69 ++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/frame/AbFaker/fakerData.py b/frame/AbFaker/fakerData.py index 4e9423f..f2acd80 100644 --- a/frame/AbFaker/fakerData.py +++ b/frame/AbFaker/fakerData.py @@ -1,52 +1,43 @@ # https://github.com/joke2k/faker # pip3 install Faker -from faker import Faker -from faker.providers import BaseProvider + import json from typing import Union from urllib import parse +import logging +from faker import Faker -fake = Faker('zh-CN') - - -class parameterProvider(BaseProvider): - # fake = Faker() - # fake.add_provider(parameterProvider) - # fake.hello() - def hello(self): - print('Say hello from parameterProvider') +fake = Faker('zh-CN') class myFaker(Faker): json_types = [int, float, bool, dict, None, list, str] - def guess_type(self, obj: str, types=list()): - """guess string data type.""" + def guess_type(self, obj: str, types=None): + """guess string data type. + return type like 'bool' + """ types = types or self.json_types for obj_type in types: try: if obj_type is bool: if "true" == obj.lower() or "false" == obj.lower(): return 'bool' - else: - continue + continue elif obj_type is dict: if "{" == obj[0] and "}" == obj[-1]: - json.loads(obj.replace("'",'"')) + json.loads(obj.replace("'", '"')) return 'dict' - else: - continue + continue elif obj_type is list: if self.isList(obj): return 'list' - else: - continue + continue elif obj_type is None: if "null" == obj: return "None" - else: - continue + continue else: obj_type(obj) return str(obj_type) @@ -55,7 +46,7 @@ def guess_type(self, obj: str, types=list()): return str(type(None)) @staticmethod - def isList(valueStr: str): + def is_list(valueStr: str): # case [1,2,3,4,[1,2,[1,2]]] start_index = valueStr.rindex('[') end_index = valueStr.index(']') @@ -65,17 +56,17 @@ def isList(valueStr: str): return False newValueStr = valueStr.replace( valueStr[start_index:end_index+1], '0') - if 2 > len(newValueStr): + if len(newValueStr) < 2: return True else: return myFaker.isList(newValueStr) except Exception as e: + logging.warning(e) return False def fakeDataByTpye(self, valueStr, is_str=False): # 暂时仅支持json的数据类型 strType = self.guess_type(valueStr) - print(valueStr) if 'int' in strType: return self.pyint() if 'float' in strType: @@ -98,10 +89,12 @@ def fakeDataByTpye(self, valueStr, is_str=False): def syncParameter(self, source_param: Union[str, dict]): """ return parameter from url or body.""" + result = None if isinstance(source_param, dict): - return self.syncBodyParameter(source_param) + result = self.syncBodyParameter(source_param) else: - return self.syncUrlParameter(source_param) + result = self.syncUrlParameter(source_param) + return result def syncBodyParameter(self, source_param: dict): for k, v in source_param.items(): @@ -131,22 +124,26 @@ def generatorParameter(self, source_param: Union[str, dict], withoutFaker: Union source_param[key] = self.fakeDataByTpye(value) return source_param - def fakeRequests(self, param_type: str, source_param: [str, dict], withoutFaker): + def fakeRequests(self, param_type: str, source_param: [str, dict], withoutFaker=None): + result = None + if not withoutFaker: + withoutFaker = [] fakerData = self.generatorParameter(source_param, withoutFaker) if 'url' == param_type: if 0 >= source_param.find('?'): - urlRoute = '' + result = '' else: - urlRoute = source_param.split('?')[0] + "?" + result = source_param.split('?')[0] + "?" urlParam = '&'.join([k+"="+str(v) for k, v in fakerData.items()]) - return urlRoute + urlParam + result += urlParam elif "body" == param_type: - return fakerData + result = fakerData + return result - def fakeUrlRequests(self, url, withoutFaker=list()): + def fakeUrlRequests(self, url, withoutFaker=None): return self.fakeRequests('url', url, withoutFaker) - def fakeBodyRequests(self, body, withoutFaker=list()): + def fakeBodyRequests(self, body, withoutFaker=None): return self.fakeRequests('body', body, withoutFaker) @@ -165,10 +162,10 @@ def requestsDemo(seed=0): fakeBody = fake.fakeBodyRequests({'errormsg': "fake data", "result": 344}) print("faker new body is %s" % fakeBody) fakeBody = fake.fakeBodyRequests( - {'errormsg': "fake data", "result": {"total": {"show_num":["213++",3],"hide_num":0}}}) + {'errormsg': "fake data", "result": {"total": {"show_num": ["213++", 3], "hide_num": 0}}}) print("faker new body is %s" % fakeBody) if __name__ == "__main__": simpleDemo() - requestsDemo() \ No newline at end of file + requestsDemo() From 15843b229ea244142d2ebcc9b087f78693d153d9 Mon Sep 17 00:00:00 2001 From: JoeEmp <2057567309@qq.com> Date: Thu, 26 Aug 2021 19:28:36 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BC=98=E5=8C=96Gevent=20demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frame/Gevent/req.py | 61 +++++++++++++++++++++--------------------- frame/Gevent/server.py | 24 +++++++---------- 2 files changed, 39 insertions(+), 46 deletions(-) diff --git a/frame/Gevent/req.py b/frame/Gevent/req.py index b392bda..2f2720b 100644 --- a/frame/Gevent/req.py +++ b/frame/Gevent/req.py @@ -1,30 +1,24 @@ -''' -@Author: your name -@Date: 2019-12-29 11:51:56 -@LastEditTime : 2019-12-29 15:00:06 -@LastEditors : Please set LastEditors -@Description: In User Settings Edit -@FilePath: /Gevent/req.py -''' -import requests import random +import time +import requests import gevent from gevent import Timeout, monkey -import time -import signal + monkey.patch_all() -timer = Timeout(1).start() +TIMER = Timeout(1) +TIMER.start() + -def get_data(num,begin=0,**kwargs): +def get_data(num, begin=0, **kwargs): """ - + Arguments: num {[int} -- 获取数量 - + Yields: [str] -- 用户名 - """ + """ if 'filename' not in kwargs: kwargs['filename'] = '' try: @@ -34,43 +28,47 @@ def get_data(num,begin=0,**kwargs): if i < begin: continue yield lines[i] - except IndexError as e: + except IndexError: print('文件内容不足,使用随机生成名字') - for i in range(len(lines),num): + for i in range(len(lines), num): yield make_name() - except FileNotFoundError as e: + except FileNotFoundError: for i in range(num): yield make_name() -def make_name(len=4): + +def make_name(length=4): s = '' for i in range(len): if 0 == i: - s += chr(random.randrange(65,65+26)) + s += chr(random.randrange(65, 65+26)) else: - s += chr(random.randrange(97,97+26)) - print('生成name:',s) + s += chr(random.randrange(97, 97+26)) + print('生成name:', s) return s -def make_data(num,filename): - with open(filename,'w') as f: - for i in range(num): + +def make_data(num, filename): + with open(filename, 'w') as f: + for _ in range(num): f.write(make_name+'\n') f.close() + def req(name): - return requests.get('http://localhost:5000/%s'%name) + return requests.get('http://localhost:5000/%s' % name) + -def erupt_get_hello(num,**kwargs): +def erupt_get_hello(num, **kwargs): if 'filename' not in kwargs: kwargs['filename'] = '' begin_time = time.time() # 异步模式 run_gevent_list = [] for name in get_data(num): - run_gevent_list.append(gevent.spawn(req,name)) + run_gevent_list.append(gevent.spawn(req, name)) try: - gevent.joinall(run_gevent_list,timeout=timer) + gevent.joinall(run_gevent_list, timeout=TIMER) except Timeout: print('返回超时') # 同步处理查看哪一次请求返回缓慢,但是速度慢 @@ -84,5 +82,6 @@ def erupt_get_hello(num,**kwargs): print('单次测试时间(平均)s:', (end - begin_time) / num) print('累计测试时间 s:', end - begin_time) + if __name__ == "__main__": - erupt_get_hello(100) \ No newline at end of file + erupt_get_hello(100) diff --git a/frame/Gevent/server.py b/frame/Gevent/server.py index b96a985..d96665b 100644 --- a/frame/Gevent/server.py +++ b/frame/Gevent/server.py @@ -1,24 +1,18 @@ -''' -@Author: JoeEmp -@Date: 2019-12-29 11:53:48 -@LastEditTime : 2019-12-29 15:00:46 -@LastEditors : Please set LastEditors -@Description: In User Settings Edit -@FilePath: /Gevent/server.py -''' -from flask import Flask import random from time import sleep -app = Flask(__name__) +from flask import Flask +APP = Flask(__name__) -@app.route('/') + +@APP.route('/') def hello_user(username='world'): # 模拟返回缓慢 - i = random.randint(0,1000) + i = random.randint(0, 1000) if i > 800: sleep(2) - print('%s requests sleep 2s'%username) - return 'Hello, %s'%username + print('%s requests sleep 2s' % username) + return 'Hello, %s' % username + if __name__ == "__main__": - app.run(debug=False,port=5000) \ No newline at end of file + APP.run(debug=False, port=5000) From 9322843634fde09aa02e738e74d08ecf166a735b Mon Sep 17 00:00:00 2001 From: JoeEmp <2057567309@qq.com> Date: Fri, 27 Aug 2021 00:57:34 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=9F=BA=E4=BA=8Epylint=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adb_shell/shortcut.py | 1 + cookbook/collections_demo.py | 7 ++-- frame/Locust/server.py | 63 ++++++++++++++++++++---------------- frame/Locust/utils.py | 25 +++++++------- 4 files changed, 54 insertions(+), 42 deletions(-) diff --git a/adb_shell/shortcut.py b/adb_shell/shortcut.py index 5773b0c..9c60ca4 100644 --- a/adb_shell/shortcut.py +++ b/adb_shell/shortcut.py @@ -1,5 +1,6 @@ import os + def get_activity_app_apk(target_name='', pkg_name=''): """ 获取当前app安装包 diff --git a/cookbook/collections_demo.py b/cookbook/collections_demo.py index 70cc61f..7482100 100644 --- a/cookbook/collections_demo.py +++ b/cookbook/collections_demo.py @@ -2,17 +2,18 @@ def search(lines, pattern, history=5): - previous_lines = deque(maxlen=history) + previous_lines = deque(maxlen=history-1) for line in lines: if pattern in line: yield line, previous_lines previous_lines.append(line) + # Example use on a file -if __name__ == '__main__': +if __name__ == '__main__ ': with open(r'somefile.txt') as f: for line, prevlines in search(f, 'python', 1): for pline in prevlines: print(pline, end='') print(line, end='') - print('-' * 20) \ No newline at end of file + print('-' * 20) diff --git a/frame/Locust/server.py b/frame/Locust/server.py index 1dfea5f..8cff4ba 100644 --- a/frame/Locust/server.py +++ b/frame/Locust/server.py @@ -1,31 +1,27 @@ -from flask import Flask, request, jsonify import logging import os -from utils import generate_index,generate_account,load_csv +from flask import Flask, request, jsonify +from utils import generate_index, load_csv -app = Flask(__name__) +APP = Flask(__name__) USER_TABLE = [] USER_INDEX = [] -file_dir = os.path.abspath(os.path.dirname(__file__))+os.sep - def generate_account(num, filename=''): - import os file_dir = os.path.abspath(os.path.dirname(__file__))+os.sep - filename = filename or file_dir+"locuts_account.csv" - if os.path.exists(filename): - return filename - else: + filename = filename or file_dir + "locuts_account.csv" + if not os.path.exists(filename): from faker import Faker fake = Faker() Faker.seed(10086) lines = [] lines.append('username,password'+os.linesep) - for i in range(num): + for _ in range(num): lines.append(fake.free_email()+','+fake.ean8()+os.linesep) with open(filename, 'w') as f: f.writelines(lines) - return filename + return filename + def get_user(username): global USER_TABLE @@ -33,18 +29,20 @@ def get_user(username): try: return USER_TABLE[USER_INDEX.index(username)] except ValueError as e: - logging.warning('system without user {}'.format(username)) + logging.warning('system without user %s' % (username)) return {} except KeyError as e: - logging.error('Data asymmetry {}'.format(e)) + logging.error('Data asymmetry %s' % (e)) return {} + def init_data(): global USER_TABLE global USER_INDEX filename = generate_account(100) USER_TABLE = load_csv(filename) - USER_INDEX = generate_index(USER_TABLE,'username') + USER_INDEX = generate_index(USER_TABLE, 'username') + def request_parse(req_data): '''解析请求数据并以json形式返回''' @@ -54,23 +52,32 @@ def request_parse(req_data): data = req_data.args return data + def is_legal_uer(username): - return True if get_user(username) else False + return bool(get_user(username)) + def is_right_password(username, password): account = get_user(username) + result = False if account: - return True if password == account['password'] else False - else: - return False + result = bool(password == account['password']) + return result + -@app.route('/') +@APP.route('/') def index(): return '

Hello

' -@app.route('/login', methods=['POST']) +@APP.route('/login', methods=['POST']) def login(): + msgs = { + "success": "login success", + "pwd_error": "the password is error", + "not_exist": "user {username} is not exist" + } + msg_param = {} data = request_parse(request) try: username, password = data.get('username'), data.get('password') @@ -79,23 +86,25 @@ def login(): if is_legal_uer(username): if is_right_password(username, password): logging.info('login success') - return jsonify(msg='login success') + key = 'success' else: logging.info('the password is error') - return jsonify(msg='the password is error') + key = 'pwd_error' else: - return jsonify(msg='user %s is not exist' % username) + key, msg_param['username'] = 'not_exist', username + return jsonify(msg=msgs[key]) + -@app.route('/about', methods=['GET', 'POST']) +@APP.route('/about', methods=['GET', 'POST']) def about(): return jsonify(msg='about flask') if __name__ == "__main__": init_data() - app.config['JSON_AS_ASCII'] = False + APP.config['JSON_AS_ASCII'] = False try: - app.run(host='0.0.0.0', + APP.run(host='0.0.0.0', port=10086, debug=True, threaded=True diff --git a/frame/Locust/utils.py b/frame/Locust/utils.py index 42c4139..e40ca4e 100644 --- a/frame/Locust/utils.py +++ b/frame/Locust/utils.py @@ -1,20 +1,21 @@ +import os +from faker import Faker + + def generate_account(num, filename=''): - import os file_dir = os.path.abspath(os.path.dirname(__file__))+os.sep filename = filename or file_dir+"locuts_account.csv" - if os.path.exists(filename): - return filename - else: - from faker import Faker + if not os.path.exists(filename): fake = Faker() Faker.seed(10086) lines = [] lines.append('username,password'+os.linesep) - for i in range(num): + for _ in range(num): lines.append(fake.free_email()+','+fake.ean8()+os.linesep) with open(filename, 'w') as f: f.writelines(lines) - return filename + return filename + def load_csv(filename): lines = [line.rstrip() for line in open(filename)] @@ -24,11 +25,11 @@ def load_csv(filename): lines[i] = dict() for j in range(len(header)): lines[i][header[j]] = accout[j] - line = lines[i] return lines -def generate_index(table:list,key:str): - if table: - return [line[key] for line in table] - +def generate_index(table: list, key: str): + result = [] + if table: + result = [line[key] for line in table] + return result From 361d49c059e7f8f324ab7cdda6a7f9c660fbf6d2 Mon Sep 17 00:00:00 2001 From: JoeEmp <2057567309@qq.com> Date: Thu, 27 Jan 2022 14:36:16 +0800 Subject: [PATCH 4/7] fix shell bug --- frame/bddwithselenium/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frame/bddwithselenium/readme.md b/frame/bddwithselenium/readme.md index a240df9..465267d 100644 --- a/frame/bddwithselenium/readme.md +++ b/frame/bddwithselenium/readme.md @@ -16,7 +16,7 @@ pip install selenium ### 快速开始 ```(shell) -mv {this_file_dir} +cd {this_file_dir} behave baidu.feature ``` @@ -37,4 +37,4 @@ And、But: 可以理解为补充说明,这里做出约定,And为期望内容 [behave在有车以后的实现](http://gitlab.repos.suv163.com/xingzhongxiang/iyc-appium/tree/master) -[BDD简介和学习](https://www.ibm.com/developerworks/cn/opensource/os-cn-bdd-web-ui-test/index.html) \ No newline at end of file +[BDD简介和学习](https://www.ibm.com/developerworks/cn/opensource/os-cn-bdd-web-ui-test/index.html) From f7af4187a68e03861b43e3f9131519abbcc10885 Mon Sep 17 00:00:00 2001 From: JoeEmp <2057567309@qq.com> Date: Thu, 27 Jan 2022 16:07:50 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E8=A1=A5=E5=85=85datatable=E7=9A=84?= =?UTF-8?q?=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frame/bddwithselenium/readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frame/bddwithselenium/readme.md b/frame/bddwithselenium/readme.md index 465267d..57aae41 100644 --- a/frame/bddwithselenium/readme.md +++ b/frame/bddwithselenium/readme.md @@ -38,3 +38,5 @@ And、But: 可以理解为补充说明,这里做出约定,And为期望内容 [behave在有车以后的实现](http://gitlab.repos.suv163.com/xingzhongxiang/iyc-appium/tree/master) [BDD简介和学习](https://www.ibm.com/developerworks/cn/opensource/os-cn-bdd-web-ui-test/index.html) + +[dataTable的各种写法](https://github.com/cucumber/cucumber-jvm/tree/main/datatable) From ba27c0e6a195f879964644fcd3eb57735fd859c6 Mon Sep 17 00:00:00 2001 From: JoeEmp <2057567309@qq.com> Date: Mon, 11 Mar 2024 11:34:47 +0800 Subject: [PATCH 6/7] =?UTF-8?q?[code]=E7=AE=80=E6=98=93=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/mulThread.py | 94 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 base/mulThread.py diff --git a/base/mulThread.py b/base/mulThread.py new file mode 100644 index 0000000..c961438 --- /dev/null +++ b/base/mulThread.py @@ -0,0 +1,94 @@ +from threading import Thread +import threading +import requests +from abc import abstractmethod +from queue import Queue +import urllib3 +urllib3.disable_warnings() + +q = Queue() + +class Producer(): + + def __init__(self, q: Queue, items=None, time=0, item=None) -> None: + self._q = q + self.items = items or (item for _ in range(time)) + if isinstance(self.items, list): + self.items = iter(self.items) + + @classmethod + def simple_produce(cls, q, time, item): + return cls(q, time=time, item=item) + + @classmethod + def by_list(cls, q, items): + return cls(q, items=items) + + def execute(self): + count = 0 + while True: + try: + q.put(next(self.items)) + count += 1 + except StopIteration: + break + print(f'生产完成,生产总数为: {count}') + + +class Consumer(): + + def __init__(self, q: Queue, max_executor: int) -> None: + self._q = q + self.max_executor = max_executor + self.consumer_list = [] + + @property + def is_full(self): + return self.max_executor <= len(self.consumer_list) + + def run(self): + while True: + if 0 == self._q.qsize() and 'ProducerThread' not in [t.getName() for t in threading.enumerate() if t.is_alive()]: + print('已完成生产和消费,退出轮询消费') + break + # 线程已满 + if self.is_full: + alive_consumer = [t for t in threading.enumerate( + ) if t.is_alive() and 'MainThread' not in t.getName()] + self.consumer_list = [ consumer for consumer in self.consumer_list if consumer in alive_consumer] + elif self._q.qsize(): + item = self._q.get() + t = Thread(target=self.execute,args=(item,)) + self.consumer_list.append(t) + t.start() + # 等待线程完成消费 + while True: + alive_consumer = [t for t in threading.enumerate( + ) if t.is_alive() and 'MainThread' not in t.getName()] + if 0 == len(alive_consumer): + break + + @abstractmethod + def execute(self,item): + pass + + +class RequestDemo(Consumer): + def execute(self, item): + response = requests.post(**item, proxies={ + "http": "http://127.0.0.1:8888", + "https": "http://127.0.0.1:8888", + }, verify=False) + try: + print(response.json()) + except Exception as e: + print(response) + print(response.text) + +item={ + 'url': 'http://127.0.0.1:5000/' +} + +pt = Thread(target=Producer.simple_produce(q, 20,item).execute, name='ProducerThread') +pt.start() +RequestDemo(q, 4).run() From 054bdb0e5c61d0396580cb19816546520e8f4851 Mon Sep 17 00:00:00 2001 From: JoeEmp <2057567309@qq.com> Date: Tue, 19 Nov 2024 15:57:03 +0800 Subject: [PATCH 7/7] =?UTF-8?q?[fix]=E9=94=99=E8=AF=AF=E7=9A=84=E9=98=9F?= =?UTF-8?q?=E5=88=97=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/mulThread.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/mulThread.py b/base/mulThread.py index c961438..9bedca4 100644 --- a/base/mulThread.py +++ b/base/mulThread.py @@ -28,7 +28,7 @@ def execute(self): count = 0 while True: try: - q.put(next(self.items)) + self._q.put(next(self.items)) count += 1 except StopIteration: break