测试自动化框架
项目描述
统一的 QA 自动化框架!
prodigyqa是一个基于python的统一测试自动化框架。这是在对大多数项目中用于 UI/Rest API 测试的现有方法进行彻底研究后得出的,这有望轻松解决问题陈述列表。该框架旨在建设性地融合各种指南、编码标准、概念、流程、实践、项目层次结构、模块化、报告机制、测试数据注入等,成为自动化测试的支柱。
主要特征
-
Selenium 函数:该模块包含大量 Selenium 包装函数,这些函数通常用于 UI 测试。这些包装的函数提供了对常规 selenium 方法的异常处理的屏蔽,处理可能发生的所有不同类型的异常。如果由于某种原因,提供的任何方法都不起作用,则通过利用其他技术/javascript,在每种方法中都提供了一种回退机制
-
Rest API 函数:该模块包含 Rest API 包装函数,这些函数通常用于 Rest API 测试,通过利用 python 'requests' 库。这些方法是通用的,可以处理任何类型的请求,如 GET、PUT、POST、DELETE 等。该模块具有管理身份验证令牌的规定。此外,还有用于常用断言类型和验证参数的通用方法,它们以最可能的简化方式与请求头、有效负载等一起出现
-
实用程序:该模块旨在提供社区支持的实用程序库,这些实用程序库以可重用性为重点。以下是框架当前支持的实用程序:
-
图像比较:该模块通过 openCV、SSIM(结构化相似性指数)提供图像比较,而不是逐像素比较。这些方法是通用的,只需要 2 张图像来计算差异。
-
Captcha Reading:此实用程序通过利用“pytesseract”模块从图像中执行验证码读取。它将图像作为输入,包含验证码,并返回一个字符串,提及验证码。
-
Web 应用程序中的拼写检查、可访问性检查:该模块处于 WIP 模式,我们通过利用网络蜘蛛概念在 Web 应用程序中启用拼写检查和可访问性检查,它以有条不紊、自动化的方式浏览万维网,需要从网页中删除所有链接,以便可以重复该过程。
-
-
报告:该框架足够灵活,可以与多个报告平台(如
reportportal.io等)一起使用。allure-report还可以通过使用pytest-html模块生成常规、自包含和可自定义的 HTML 报告。(作为此包的依赖项捆绑在一起) -
持续测试:该框架通过利用 Docker 为 CT(持续测试)提供了便利。框架中提供的 docker 文件可用于从头开始设置在任何服务器上运行框架所需的必要先决条件/环境。
先决条件
该框架适用于
安装
建议直接从 PyPi 安装 Valid/Tested Version,因为它会自动解决依赖问题。
pip install prodigyqa
如果对当前设置进行任何自定义更新,我们将需要克隆当前存储库并运行python setup.py develop,以便本地更改反映在安装版本中。
运行测试
prodigyqa --> Examples文件夹下列出了所有功能的示例测试用例。要运行示例测试,请打开命令提示符/终端,转到 prodigyqa --> 示例文件夹并运行以下命令:
pytest {filename}.py -s(-s 表示标准输出,关于pytest框架及其特性/插件/选项等的详细了解请参考这里)
浏览器操作
浏览器操作模块方法摘要
这个模块包含了 selenium web 驱动函数。以下是本模块处理的主要领域:
- 最常见的是,如果对象正在更改状态,则 DOM 刷新将导致异常 (StaleElementReferenceException)。我们通过检查 Web Page Expected to be in ready state 来处理这个问题,如果在网页处于预期状态后对象不存在于网页中,则捕获异常以防止失败。
- 该模块的大部分功能都会捕获异常以防止失败。
| 方法名称 | 描述 | 精氨酸 | 用法 |
|---|---|---|---|
| page_readiness_wait | 网页预计处于就绪状态。 | self.page_readiness_wait() | |
| locator_check | Local 分类定位器类型的方法。 | (a)locator_dict:定位器值字典,定位器依据和值 | self.locator_check(locator_dict) |
| 打开 | 打开传递的'url'。 | 自我打开(网址) | |
| 重新加载页面 | 通过 selenium 或 java 脚本刷新页面的方法。 | self.reload_page() | |
| 获取页面源 | 返回当前页面或框架的整个 HTML 源代码。 | self.get_page_source() | |
| 获取标题 | 返回当前页面的标题。 | self.get_title() | |
| 获取位置 | 使用 Selenium/Java 脚本返回当前浏览器 URL。 | self.get_location() | |
| 获取属性 | 使用子定位器从提供的定位器/元素/父元素中获取属性。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。(b) attribute_name: 属性名来获取它的值。(c) 元素:它是一个 webelement 。(d) 类型:类型值应为“定位器”或“元素”或“混合” | self.get_attribute(locator=None, element=None, attribute_name=None, type='locator') |
| 点击 | 单击一个元素。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。 | self.click(定位器) |
| 发送键 | 发送文本但不清除现有文本。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。(b) 要发送的字符串。 | self.send_keys(定位器) |
| 获取文本 | 从提供的定位器中获取文本。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。 | self.get_text(定位器) |
| 回去 | 使用 selenium 或 js 模拟浏览器上的后退按钮。 | self.go_back() | |
| 直走 | 使用 selenium 或 js 模拟浏览器上的前进按钮。 | self.go_forward() | |
| 设置窗口大小 | 设置当前窗口的宽度和高度。(window.resizeTo) | (a) 宽度:设置窗口的宽度(以像素为单位)。(b) 高度:设置窗口的高度(以像素为单位)。 | self.set_window_size(800,600) |
| 最大化 | 最大化当前窗口。 | 自我最大化() | |
| 获取驱动程序名称 | 返回 webdriver 实例的名称。 | self.get_driver_name() | |
| get_domain_url | 从 webdriver 本身提取域 url 的方法。 | self.get_domain_url() | |
| 明文 | 如果它是文本输入元素,则清除文本 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。 | self.clear_text(定位器) |
| capture_screenshot | 将屏幕截图保存到目录(现有的或新的)。 | (a) 文件路径:带有目录路径的文件名(C:/images/image.png)。 | self.capture_screenshot(自我,文件路径) |
| switch_to_active_element | 返回具有焦点的元素,如果没有焦点则返回 BODY。 | self.switch_to_active_element() | |
| switch_to_window | 使用 selenium/javascript 将焦点切换到指定窗口。 | (a) 要切换的窗口名称 | self.switch_to_window(窗口) |
| switch_to_frame | 使用 selenium/javascript 将焦点切换到指定帧。 | (a) framename:要切换的帧的名称。 | self.switch_to_frame(framename) |
| switch_to_default_content | 将焦点切换到默认框架。 | self.switch_to_default_content() | |
| switch_to_alert | 将焦点切换到页面上的警报。 | self.switch_to_alert() | |
| hover_on_element | 将鼠标悬停在特定元素上。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。 | self.hover_on_element(定位器) |
| hover_on_click | 悬停并单击特定元素。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。 | self.hover_on_click(定位器) |
| 等待元素 | 等待一个元素存在于 UI 中。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。 | self.wait_for_element(定位器) |
| wait_and_accept_alert | 等待并接受页面上存在的警报。 | self.wait_and_accept_alert() | |
| wait_and_reject_alert | 等待警报并拒绝。 | self.wait_and_reject_alert() | |
| select_option_by_index | 按索引选择选项。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。(b) index:索引的整数值。 | self.select_option_by_index(定位器,索引) |
| select_option_by_value | 使用值选择选项。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。(b) value:选择选项的字符串值。 | self.select_option_by_value(定位器,值) |
| select_option_by_text | 使用文本选择值。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。(b) text:选择选项的字符串值。 | self.select_option_by_text(定位器,文本) |
| 滚动到页脚 | 滚动到页面末尾。 | self.scroll_to_footer() | |
| 滚动到元素 | 滚动到页面上的特定元素。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。 | self.scroll_to_element(定位器) |
| javascript_click | 使用 javscript 执行点击 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。 | self.java(定位器) |
| is_element_displayed | 基于元素的返回布尔值与定位器一起显示。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。 | self.is_element_displayed(定位器) |
| is_element_enabled | 使用定位器启用基于元素的返回布尔值。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。 | self.is_element_enabled(定位器) |
| is_element_selected | 使用定位器选择基于元素的返回布尔值。 | (a) 定位器:标识符类型和值的字典({'by':'id', 'value':'start-of-content.'})。 | self.is_element_selected(定位器) |
| switch_to_active_window | 将焦点切换到新窗口 | 将焦点从当前窗口切换到新窗口 | self.switch_to_active_window() |
| switch_to_frame_by_index | 根据索引将焦点切换到指定帧 | 框架索引 | self.switch_to_frame_by_index(index) |
API 测试模块
REST API 模块方法总结
| 方法名称 | 描述 | 精氨酸 | 用法 |
|---|---|---|---|
| api请求 | 根据输入法和kwargs触发rest api请求 | (a).method:GET/POST/PUT/PATCH/DELETE (b).kwargs:参考下面的 REST API kwarg 部分表 | self.apirequest(method='GET') |
| assert_in_resp | 检查响应数据是否包含输入成员。 | (a)resp:对验证的响应。(b)member: 值来检查响应。(c)container:点格式的响应键路径,应以“resp.”开头。示例:resp.data.0.name | self.assert_in_resp(resp,成员,容器) |
| assert_not_in_resp | 检查响应数据是否包含输入成员。 | (a)resp:对验证的响应。(b)member: 值来检查响应。(c)container:点格式的响应键路径,应以“resp.”开头。示例:resp.data.0.name | self.assert_not_in_resp(resp,成员,容器) |
| assert_equal_resp | 检查响应数据是否包含输入成员。 | (a)resp:对验证的响应。(b)member: 值来检查响应。(c)container:点格式的响应键路径,应以“resp.”开头。示例:resp.data.0.name | self.assert_equal_resp(resp,成员,容器) |
| assert_not_equal_resp | 检查响应数据是否包含输入成员。 | (a)resp:对验证的响应。(b)member: 值来检查响应。(c)container:点格式的响应键路径,应以“resp.”开头。示例:resp.data.0.name | self.assert_not_equal_resp(resp,成员,容器) |
REST API kwarg 部分
| 参数名称 | 参数类型 | 描述 |
|---|---|---|
| 网址 | 标准 | API 请求地址 |
| 参数 | 可选的 | 字典,要在请求正文中发送的元组或字节列表。 |
| 数据 | 可选的 | 要在请求正文中发送的字典、元组列表、字节或类似文件的对象。 |
| json | 可选的 | 要在请求正文中发送的 JSON 可序列化 Python 对象。 |
| 标题 | 可选的 | 与请求一起发送的 HTTP 标头字典。 |
| 饼干 | 可选的 | 与请求一起发送的字典或 CookieJar 对象。 |
| 文件 | 可选的 | 'name' 字典:file-like-objects(或 {'name': file-tuple})用于多部分编码上传。文件元组可以是 2 元组('filename',fileobj),3 元组('filename',fileobj,'content_type')或 4 元组('filename',fileobj,'content_type',custom_headers),其中 'content-type' 是定义给定文件的内容类型的字符串,而 custom_headers 是一个类似 dict 的对象,其中包含要为文件添加的其他标题。 |
| 授权 | 可选的 | 验证元组以启用基本/摘要/自定义 HTTP 身份验证。 |
| 超时(浮点数或元组) | 可选的 | 在放弃之前等待服务器发送数据的秒数,作为浮点数或(连接超时,读取超时)元组。 |
| 允许重定向(布尔) | 可选的 | 布尔值。启用/禁用 GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD 重定向。默认为真。 |
| 代理 | 可选的 | 字典映射协议到代理的 URL。 |
| 核实 | 可选的 | 要么是布尔值,在这种情况下,它控制我们是否验证服务器 TLS 证书,要么是字符串,在这种情况下,它必须是要使用的 CA 包的路径。默认为真。 |
| 溪流 | 可选的 | 如果为 False,则将立即下载响应内容。 |
| 证书 | 可选的 | 如果是字符串,则为 ssl 客户端证书文件 (.pem) 的路径。如果是元组,(证书,密钥)对。 |
实用程序
utils Module方法的拼写检查器总结
utils 模块的拼写检查方法将捕获网页内容并根据标准字典对其进行验证,以确保拼写正确。
| 方法名称 | 描述 | 精氨酸 | 用法 |
|---|---|---|---|
| 拼写检查器 | 拼写检查器。 | (a) url:网页 url (b) words:应用程序特定词的列表 | spell_checker(self, url, words=[]) |
| l |
比较模块
模块具有用于比较各种文件类型的实用方法
| 方法名称 | 描述 | 精氨酸 | 用法 |
|---|---|---|---|
| 比较图像 | 比较图像并返回图像的结构相似性。SSIM 的度量在 0-1.0 之间返回,其中 1.0 是最相同的,0 是完全不同的。 | a) 源图像路径。b) 目标图像路径。 | self.compare_images(源,目标) |
| compare_json | 比较 json 文件并返回目标与源相比差异的字典。 | a) 源 json。b) 目标 json | self.compare_json(源,目标) |
| 比较文件 | 比较两个文件并返回 xl 的差异(如果有)。支持的文件类型是 xls 或 xlsx csv | a) 源文件路径。b) 目标文件路径。 | self.compare_files(源,目标) |
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。