当前位置: 首页 > news >正文

开发公司综合部内部管理章程汕头自动seo

开发公司综合部内部管理章程,汕头自动seo,网页界面设计案例赏析,南京奥体建设公司该部分是对自动化测试专栏前四篇的一个补充#xff0c;本次参考以下文章实现一个完整的谷歌翻译接口自动化测试:   [1]【python小脚本】Yaml配置文件动态加载   [2]【python做接口测试的学习记录day8——pytest自动化测试框架之热加载和断言封装】 目标#xff1a;框架封…该部分是对自动化测试专栏前四篇的一个补充本次参考以下文章实现一个完整的谷歌翻译接口自动化测试:   [1]【python小脚本】Yaml配置文件动态加载   [2]【python做接口测试的学习记录day8——pytest自动化测试框架之热加载和断言封装】 目标框架封装完成后不需要写python脚本只需要增加yaml测试用例即可。 PS该案例是在B站初步自学完1-24自己编的练练手比较简单如果有错误地方请私聊更改。这个视频200集感觉是在翻来覆去得讲相同的东西先学以致用练一练后续会找更复杂的测试项目进行学习。 目录 1. 框架的搭建之文件组织架构2.基于爬虫的谷歌翻译接口自动化测试2.1 第一步梳理业务功能的调用链接口间的依赖关系2.2 第二步框架的搭建 1. 框架的搭建之文件组织架构 框架一 可以根据项目的需求和规模进行适当的调整和扩展。pytest 允许非常灵活的组织方式以适应各种项目。 api_frame/ │ ├── testcases/ │ ├── test_module1.py │ ├── test_module2.py │ ├── subdirectory/ │ │ ├── test_module3.py │ │ └── test_module4.py │ │ │ └── conftest.py │ ├── src/ │ ├── module1.py │ └── module2.py │ └── requirements.txt 项目根目录api_frame/ 项目的顶层目录通常包含项目的配置文件和测试脚本。 testcases/ 存放测试脚本的目录。测试脚本的文件名通常以 test_ 开头以 .py 结尾。在示例中有两个测试模块文件test_module1.py 和 test_module2.py以及一个子目录 subdirectory/其中包含两个测试模块文件test_module3.py 和 test_module4.py。 conftest.py 这是一个特殊的 pytest 配置文件它可以包含一些全局的配置、夹具fixtures等供所有测试模块使用。 src/ 存放项目的源代码的目录。通常项目的源代码和测试代码分开存放以保持项目的结构清晰。 requirements.txt 存放项目的依赖关系的文本文件。通常你可以使用 pip install -r requirements.txt 命令来安装项目所需的依赖包。 框架二 一个典型的 API 测试框架的组织结构它通常用于自动化测试和持续集成环境中以确保 API 的稳定性和可靠性。框架提供了测试用例编写、数据管理、测试运行、报告生成等功能。 api_frame/ ├── commons/ │ ├── __init__.py │ ├── api.py │ ├── assert_utils.py │ ├── logger_utils.py │ ├── parametrize_utils.py │ ├── requests_utils.py │ └── yaml_utils.py │ ├── datas/ │ ├── __init__.py │ └── product_manage/ │ ├── hotloads/ │ ├── __init__.py │ ├── debug_xxx.py │ └── public.pem │ ├── testcases/ │ ├── product_manage/ │ ├── __init__.py │ │ ├── pm_get_token.yaml │ │ ├── pm_file_upload.yaml │ │ └── test_product_api.py │ │ │ ├── user_manage/ │ ├── __init__.py │ │ ├── um_base64.yaml │ │ ├── um_md5.yaml │ │ └── test_new_api.py │ └── __init__.py │ ├── reports/ │ ├── module1.py │ └── module2.py │ ├── venvs/ │ ├── conftest.py ├── config.yaml ├── run.py └── requirements.txt commons/ 通常包含一些通用的工具和函数以便在测试中重复使用。这些文件可能包括 api.py用于执行 API 请求和处理响应的封装。 assert_utils.py包含自定义断言函数用于验证 API 响应的内容。 logger_utils.py用于记录测试日志和生成日志报告的工具。 parametrize_utils.py包含用于参数化测试用例的工具。 requests_utils.py封装了用于发送 HTTP 请求的工具。 yaml_utils.py用于读取和解析 YAML 格式的配置文件。 datas/ 包含测试数据用于测试用例。在你的结构中子目录 product_manage/包含与产品管理相关的测试数据。 hotloads/ 这个目录包含一些热加载或配置文件用于在运行时动态加载或修改测试框架的一些配置。例如debug_xxx.py 可包含用于开启或关闭调试模式的代码。 testcases/ 存放测试用例的目录按照模块或功能进行组织。结构中包含两个子目录 product_manage/ 和 user_manage/每个子目录中包含了相应功能模块的测试用例。测试用例文件通常以 test_ 开头。 reports/ 包含测试报告生成的相关代码用于记录测试结果并生成报告。module1.py 和 module2.py 包含与报告生成相关的代码。 conftest.py pytest 配置文件通常包含一些全局的配置和夹具fixtures定义供所有测试用例共享。 config.yaml 包含测试框架的配置信息如基本 URL、认证信息等。 run.py 用于运行测试的脚本包含命令行参数解析和测试运行的逻辑。 requirements.txt 存放项目的依赖关系的文本文件通常使用 pip install -r requirements.txt 命令来安装项目所需的依赖包。 1采用yaml作为测试用例并进行数据驱动对yaml测试用例进行了规范和一致化 2传参方式丰富可以以文件形式、json格式。内置md5、base64、签名加密算法。 3基于pytest框架的轻量级接口关联通过对yaml文件进行动态配置能够在yaml文件中extract:标记key-valuevalue可以用正则匹配、json提取方式进一步处理传入的参数。 4框架支持多种断言方式相等包含数据库断言等 5要支持多种环境切换 2.基于爬虫的谷歌翻译接口自动化测试 在这里仅用一个很简单的基于爬虫的谷歌翻译接口练手。 2.1 第一步梳理业务功能的调用链接口间的依赖关系 首先根据GoogleTranslate.py源码 import json # 用于 JSON 数据处理 import requests # 用于发起 HTTP 请求 import random # 用于生成随机数 import re # 用于正则表达式处理 from urllib.parse import quote # 导入了 quote 函数用于对 URL 进行编码以防止特殊字符引起的问题。 import urllib3 # 用于处理 HTTP 请求和连接池管理。 import logging # 导入 logging 库用于记录日志信息。 from Google_Tran.google_constant import LANGUAGES, DEFAULT_SERVICE_URLSlog logging.getLogger(__name__) # 创建一个名为 __name__ 的 logger 对象用于记录与当前模块相关的日志。 log.addHandler(logging.NullHandler()) # 添加一个空的处理器以确保不会产生未处理的日志消息。urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 禁用 urllib3 库的不安全请求警告在使用不安全的 HTTPS 时避免显示警告信息。# 创建列表 URLS_SUFFIX通过列表推导式从 DEFAULT_SERVICE_URLS 提取的 Google 翻译服务的 URL 后缀。每个 URL 后缀都对应不同的国家或地区。 URLS_SUFFIX [re.search(translate.google.(.*), url.strip()).group(1) for url in DEFAULT_SERVICE_URLS] # url.strip()字符串方法去除字符串两侧的空格和换行符等空白字符。 # re.search(translate.google.(.*), url.strip())对经过 strip() 处理后的 URL 使用正则表达式进行搜索。 # 正则表达式 translate.google.(.*) 会匹配以 translate.google. 开头的字符串。 # . 表示匹配任意字符而 * 表示匹配前面的字符这里是 .零次或多次。因此.* 可以匹配任意长度的字符串。 # 如果匹配成功re.search() 函数会返回一个匹配对象match object该对象包含了关于匹配内容的详细信息例如匹配的字符串、匹配的位置等。 # 如果匹配失败则返回 None比如re.search(tran.google.(.*), url.strip())就匹配不上 # 匹配对象.group() 方法以class str形式返回获取捕获的分组内容。(.*)就是匹配的分组URL_SUFFIX_DEFAULT comclass google_new_transError(Exception):Exception that uses context to present a meaningful error messagedef __init__(self, msgNone, **kwargs):# 异常类的构造函数。它接受一个可选的 msg 参数和关键字参数 kwargs这些参数将用于初始化异常对象。self.tts kwargs.pop(tts, None)# 将关键字参数 tts和response 的值存储在对象属性 self.tts、self.rsp 中。self.rsp kwargs.pop(response, None)if msg:self.msg msgelif self.tts is not None:# 将根据 self.tts 和 self.rsp 推断 self.msg 的值。self.msg self.infer_msg(self.tts, self.rsp)else:self.msg Nonesuper(google_new_transError, self).__init__(self.msg)def infer_msg(self, tts, rspNone):cause Unknownif rsp is None: # 如果 rsp 为 None则返回一个错误消息指示连接失败可能的原因是超时。premise Failed to connectreturn {}. Probable cause: {}.format(premise, timeout)else: # 如果 rsp 不为 None则获取响应的状态码和原因并根据不同的状态码和条件返回相应的错误消息和原因。status rsp.status_codereason rsp.reasonpremise {:d} ({}) from TTS API.format(status, reason)if status 403:cause Bad token or upstream API changeselif status 200 and not tts.lang_check:cause No audio stream in response. Unsupported language %s % self.tts.langelif status 500:cause Uptream API error. Try again later.return {}. Probable cause: {}.format(premise, cause)class google_translator:You can use 108 language in target and source,details view LANGUAGES.Target language: like en、zh、th...:param url_suffix: The source text(s) to be translated. Batch translation is supported via sequence input.The value should be one of the url_suffix listed in : DEFAULT_SERVICE_URLS:type url_suffix: UTF-8 :class:str; :class:unicode; string sequence (list, tuple, iterator, generator):param text: The source text(s) to be translated.:type text: UTF-8 :class:str; :class:unicode;:param lang_tgt: The language to translate the source text into.The value should be one of the language codes listed in : LANGUAGES:type lang_tgt: :class:str; :class:unicode:param lang_src: The language of the source text.The value should be one of the language codes listed in :const:googletrans.LANGUAGESIf a language is not specified,the system will attempt to identify the source language automatically.:type lang_src: :class:str; :class:unicode:param timeout: Timeout Will be used for every request.:type timeout: number or a double of numbers:param proxies: proxies Will be used for every request.:type proxies: class : dict; like: {http: http:171.112.169.47:19934/, https: https:171.112.169.47:19934/}def __init__(self, url_suffixcom, timeout5, proxiesNone):# 构造函数初始化了翻译器对象。接受可选参数# url_suffix指定翻译服务的 URL 后缀默认为 com。# timeout指定请求超时时间默认为 5 秒。# proxies指定代理服务器用于请求。默认为 None。self.proxies proxiesif url_suffix not in URLS_SUFFIX:self.url_suffix URL_SUFFIX_DEFAULTelse:self.url_suffix url_suffixurl_base https://translate.google.{}.format(self.url_suffix)self.url url_base /_/TranslateWebserverUi/data/batchexecuteself.timeout timeoutdef _package_rpc(self, text, lang_srcauto, lang_tgtauto):# 内部方法用于将请求数据打包成合适的格式。# 它接受源文本 text、源语言 lang_src默认为 auto和目标语言 lang_tgt默认为 auto。# 返回打包后的请求数据。GOOGLE_TTS_RPC [MkEWBc] # Google 翻译服务使用的标识。parameter [[text.strip(), lang_src, lang_tgt, True], [1]]# 二维列表 parameter其中包含两个子列表。# 第一个子列表包含源文本 text、源语言 lang_src、目标语言 lang_tgt 和布尔值 True第二个子列表只包含数字 1。escaped_parameter json.dumps(parameter, separators(,, :))# 将 parameter 列表转换为 JSON 格式的字符串使用 , 和 : 作为分隔符。# JSON 支持两种基本结构# 对象Object由一组键值对组成键和值之间使用冒号 : 分隔键值对之间使用逗号 , 分隔整个对象使用花括号 {} 包围。# 数组Array由一组值组成值之间使用逗号 , 分隔整个数组使用方括号 [] 包围。数组通常用于表示有序的数据集合而对象则用于表示键值关系。rpc [[[random.choice(GOOGLE_TTS_RPC), escaped_parameter, None, generic]]]espaced_rpc json.dumps(rpc, separators(,, :))# text_urldecode quote(text.strip())freq_initial f.req{}.format(quote(espaced_rpc)) # 使用 URL 编码对 espaced_rpc 进行编码并将其插入到字符串 f.req{} 中。# quote() 函数不仅适用于 JSON 数据它可以用于任何需要进行 URL 编码的字符串。# JSON 格式的数据本质上确实是字符串但它是一种具有特定结构的字符串表示方式用于表示复杂的数据结构# 它使用文本表示数据以便在不同的编程语言和平台之间进行传递和解析。freq freq_initialreturn freqdef translate(self, text, lang_tgtauto, lang_srcauto, pronounceFalse):# 如果没有找到对应的语言就将源语言和目标语言都设为 auto。try:lang LANGUAGES[lang_src]except:lang_src autotry:lang LANGUAGES[lang_tgt]except:lang_src auto# 将输入的文本转换为字符串格式并进行长度检查。如果文本长度超过5000个字符返回警告信息。text str(text)if len(text) 5000:return Warning: Can only detect less than 5000 charactersif len(text) 0: # 如果文本长度为0直接返回空字符串。return # 创建请求头headers包括 Referer、User-Agent 和 Content-Type 等信息。headers {Referer: http://translate.google.{}/.format(self.url_suffix),# 浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的URL# 浏览器表明自己的身份User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203,# WEB 服务器告诉浏览器自己响应的对象的类型。Content-Type: application/x-www-form-urlencoded;charsetutf-8}# 调用 _package_rpc 方法生成请求数据。freq self._package_rpc(text, lang_src, lang_tgt)# 使用生成的请求数据创建一个待发送的 POST 请求对象。# requests.request()本质是先创建Session对象然后创建Request对象request requests.Request(methodPOST,urlself.url,datafreq,headersheaders,)# 在 response 中构建了一个请求对象但实际的请求发送是在接下来的 s.send(requestresponse.prepare(), ...) 这一步中进行的。try:if self.proxies None or type(self.proxies) ! dict:self.proxies {}with requests.Session() as s: # 使用 requests.Session 对象发送请求并设置代理等信息。然后从响应中逐行解析数据。requests.session()本质也是Session对象s.proxies self.proxiesr s.send(requestrequest.prepare(),verifyFalse,timeoutself.timeout) # 发送请求后r即为响应内容for line in r.iter_lines(chunk_size1024):# 通过迭代方式逐行处理从服务器接收到的响应数据。r.iter_lines() 方法允许按照指定的块大小chunk_size进行数据分块以防止一次性加载大量数据。decoded_line line.decode(utf-8) # 将每一行响应数据使用 UTF-8 编码进行解码以获取可读的字符串内容。if MkEWBc in decoded_line: # 在解析过程中检查响应数据是否包含 MkEWBc这是一个请求标识。try: # 找到 MkEWBc后尝试对响应数据进行多层 JSON 解析获取翻译结果和可能的发音信息。# MkEWBc标识所在行包含了翻译文本信息和发音信息response json.loads(decoded_line) # decoded_line是str格式转化成json列表或者字典按位置提取response json.loads(response[0][2]) # 提取的内容你那个仍然是str格式需要继续转化成json列表或者字典按位置提取response_ list(response)response response_[1][0] # 包含了翻译结果# 根据解析的结果构造翻译文本translate_text和发音信息如果需要的话最后返回相应的结果。if len(response) 1:if len(response[0]) 5:sentences response[0][5]else: ## only urlsentences response[0][0]if pronounce False:return sentenceselif pronounce True:return [sentences, None, None]translate_text for sentence in sentences:sentence sentence[0]translate_text sentence.strip() translate_text translate_textif pronounce False:return translate_textelif pronounce True:pronounce_src (response_[0][0])pronounce_tgt (response_[1][0][0][1])return [translate_text, pronounce_src, pronounce_tgt]elif len(response) 2:sentences []for i in response:sentences.append(i[0])if pronounce False:return sentenceselif pronounce True:pronounce_src (response_[0][0])pronounce_tgt (response_[1][0][0][1])return [sentences, pronounce_src, pronounce_tgt]except Exception as e:raise er.raise_for_status()except requests.exceptions.ConnectTimeout as e:raise eexcept requests.exceptions.HTTPError as e:# Request successful, bad responseraise google_new_transError(ttsself, responser)except requests.exceptions.RequestException as e:# Request failedraise google_new_transError(ttsself)def detect(self, text):text str(text)if len(text) 5000:return log.debug(Warning: Can only detect less than 5000 characters)if len(text) 0:return headers {Referer: http://translate.google.{}/.format(self.url_suffix),# 浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的URL# 浏览器表明自己的身份User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203,# WEB 服务器告诉浏览器自己响应的对象的类型。Content-Type: application/x-www-form-urlencoded;charsetutf-8}freq self._package_rpc(text)response requests.Request(methodPOST,urlself.url,datafreq,headersheaders)try:if self.proxies None or type(self.proxies) ! dict:self.proxies {}with requests.Session() as s:s.proxies self.proxiesr s.send(requestresponse.prepare(),verifyFalse,timeoutself.timeout)for line in r.iter_lines(chunk_size1024):decoded_line line.decode(utf-8)if MkEWBc in decoded_line:# regex_str r\[\[\wrb.fr\,\MkEWBc\,\\[\[(.*).*?,\[\[\[try:response json.loads(decoded_line) # decoded_line是str格式转化成json列表或者字典按位置提取response json.loads(response[0][2]) # 提取的内容你那个仍然是str格式需要继续转化成json列表或者字典按位置提取response_ list(response)detect_lang response[0][2]except Exception:raise Exception# data_got data_got.split(\\\])[0]return [detect_lang, LANGUAGES[detect_lang.lower()]]r.raise_for_status()except requests.exceptions.HTTPError as e:# Request successful, bad responselog.debug(str(e))raise google_new_transError(ttsself, responser)except requests.exceptions.RequestException as e:# Request failedlog.debug(str(e))raise google_new_transError(ttsself)if __name__ __main__:translator google_translator()translate_text translator.translate(สวัสดีจีน, lang_tgten)detect_result translator.detect(สวัสดีจีน)print()print(待翻译文本, translate_text)print(输入文本的语言种类检测, detect_result) 自定义测试需求   1翻译功能   2语言检测功能   3性能测试指标TPSTransaction per Second每秒事务数反应出一个系统的处理能力。   4响应时间RT   5多接口组合进行压测 基于爬虫的谷歌翻译接口业务接口逻辑很简单 PS如果是电商平台这种完整的应用其搜索接口就会涉及到前端交互、大数据平台交互、后端搜索系统在数据库和索引平台之间的搜索、搜索系统和第三方推荐系统之间的交互等上下游调用链是及其复杂的。基于爬虫的谷歌翻译接口仅需要调用谷歌翻译和解析响应无需和其他系统或者平台交互业务功能的调用链很简单。 2.2 第二步框架的搭建
http://www.pierceye.com/news/998378/

相关文章:

  • 爱站工具卡片式网站
  • 计算机网站开发图片湛江城乡建设局网站
  • 广州个性化网站开发代做网站关键词
  • 如何开发一个手机网站北京推广网站
  • 企业网站建设合作合同wordpress国产定制主题
  • 万网虚拟机怎么做两个网站网页设计实训步骤
  • 福田做网站公司怎么选择wordpress怎样在列表页使用瀑布流
  • 做导航网站用多大的空间广州天河区有哪些大学
  • 广州市城乡建设部网站首页做婚礼设计在哪个网站下载素材
  • 网站建设推广服务合同范本什么是电子商务专业?
  • 青岛网站建设公司电话棋牌室的网站怎么做
  • 网站更改公司需要重新备案吗传媒网站
  • 海诚网站建设青岛李村网站设计公司
  • 哪个网站可以宣传做的蛋糕网站商城微信支付接口申请
  • 如何做淘客推广网站可信赖的手机网站设计
  • 西城专业网站建设公司哪家好外贸网站优化谷歌关键词排名
  • 先做网站后备案仿做网站可以整站下载器吧
  • ASP.NET实用网站开发 课后答案开发网站过程
  • 做网站需要编码吗仿站网站源码
  • 响应式网站什么意思爱南宁app下载官网最新
  • 自己做的网站怎么添加采集模块网站管理包括哪些内容
  • php做网站验证码的设计电商网站的二级怎么做
  • 广西网站建设价钱微信crm管理系统
  • 福州网站建设公司中小企业荆门市城乡建设管理局网站
  • 建设信用卡网站首页有做车身拉花的网站吗
  • 怎么做婚恋网站织梦网站推广插件
  • rtt全民互助平台网站开发自己怎样做免费网站
  • 建站模板东营建网站公司
  • 如何用vs做网站网络推广方案下拉管家微xiala11
  • 可以做彩票广告的网站吗做网站的应用