统一的质量保证自动化框架!< >
prodigyqa是一个基于python的统一测试自动化框架。这是在对大多数项目中用于ui/rest api测试的现有方法进行了深入研究之后提出的,它有望很容易地解决一系列问题。
该框架旨在将各种指导方针、编码标准、概念、过程、实践、项目层次结构、模块化、报告机制、测试数据注入等建设性地融合到支柱自动化测试中。
主要功能
selenium函数:此模块包含大量的selenium包装函数,这些函数通常用于ui测试。这些被包装的函数提供了异常处理的屏蔽,比常规的selenium方法更好地处理可能发生的所有不同类型的异常。如果由于某种原因,提供的任何方法都不起作用,那么通过利用其他技术/javascript,在每个方法中都提供了一种回退机制。
rest api函数:此模块包含restapi包装的函数,这些函数通过利用python的"请求"库,通常用于restapi测试。这些方法是通用的,用于处理任何类型的请求,如get、put、post、delete等。模块提供了管理身份验证令牌的配置。此外,还有一些通用方法,用于以最简化的方式验证常用断言类型和参数,这些方法与请求(如头、负载等)一起提供
实用程序:此模块旨在提供以可重用性为重点构建的社区支持实用程序库。以下是框架当前支持的实用程序:
图像比较:此模块提供通过opencv、ssim(结构化相似性索引)进行图像比较的功能,而不是逐像素比较。这些方法是通用的,只需两幅图像即可计算出差异。
验证码读取:此实用程序利用"pytesseract"模块从图像执行验证码读取。它接受包含验证码的图像作为输入,并返回一个字符串,其中提到了验证码。
拼写检查,Web应用程序中的辅助功能检查:此模块处于WIP模式,在这种模式下,我们将利用WebSpider概念,以系统、自动的方式浏览万维网,从而在Web应用程序中启用拼写检查和辅助功能检查,从网页中取出所有链接,以便重复此过程。
报告:该框架足够灵活,可以与多个报告平台一起工作,如reportportal.io
,allure report
等。常规的,还可以通过使用pytest html
模块生成自包含且可自定义的html报告(该模块作为此包的依赖项捆绑在一起)
持续测试:该框架通过利用Docker为CT(持续测试)提供便利。框架中提供的Docker文件可用于从头开始在任何服务器上设置运行框架所需的必要先决条件/环境。
先决条件
框架与
安装
建议直接从PYPI安装有效/经过测试的版本,因为它将自动解决依赖关系的问题。
PIP安装ProdigyQA
如果对当前设置进行了任何自定义更新,我们将需要克隆当前存储库并运行python setup.py develop
,以便本地更改反映在安装版本中。
运行测试
所有功能的示例测试用例都列在ProdigyQA-->;examples文件夹下。要运行示例测试,请打开命令提示符/terminal,转到prodigyqa-->;examples文件夹并运行以下命令:
pytest{filename}.py-s
(-s表示标准输出,请参阅此处了解有关pytest框架及其功能/插件/选项等的详细信息)
浏览器操作
浏览器操作模块方法摘要
本模块围绕Selenium Web驱动程序功能展开。
以下是本模块中处理的主要方面:
- 最常见的情况是,如果对象正在更改状态,dom刷新将导致异常(staleElementReferenceException)。我们正在处理此问题,方法是检查预期处于就绪状态的网页,并捕获异常以防止在网页处于预期状态后该对象不在网页中时失败。
- 此模块的大多数功能将捕获异常以防止失败。
<表><广告>
方法名 | 说明
| 参数 | 用法 |
---|
< /广告><正文>
页面准备就绪等待 | 网页应处于就绪状态。 | | self.page_readiness_wait() |
定位器检查 | 定位器类型分类的局部方法。 | (a)locator_dict:定位器值、定位器依据和值的字典 | 自定位器检查(定位器dict) |
打开 | 打开传递的"url"。 | | 自行打开(URL) |
重新加载页面 | >通过Selphi或Java脚本刷新页面。 | self.reload_page() |
获取页面资源 | 返回当前页或框架的整个HTML源代码。 | | self.get_page_source() |
获取标题 | 返回当前页的标题。 | | self.get_title() |
获取位置 | 使用Sele/Java脚本返回当前浏览器URL。 | | self.get_location() |
获取属性 | 从带有子定位器的提供定位器/元素/父元素中获取属性。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.'})。(b)属性名:获取其值的属性名。(c)元素:它是一个webelement。(d)类型:类型值应为"locator"或"element"或"mixed" | self.get_attribute(locator=none,element=none,attribute_name=none,type='locator') |
单击 | 单击元素。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.})。 | self.click(定位器) |
发送u键 | 发送文本,但不清除现有文本。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.'})。(b)要发送的字符串。 | self.send_键(定位器) |
获取文本 | 从提供的定位器获取文本。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'sta内容的RT。'})。 | self.获取文本(定位器) |
返回 | 使用Selenium或JS在浏览器上模拟后退按钮。 | | self.go_back() |
前进 | 使用Selenium或JS在浏览器上模拟前进按钮。 | | self.go_forward() |
设置窗口大小 | 设置当前窗口的宽度和高度。(window.resizeto) | (a)宽度:以像素为单位设置窗口的宽度。(b)高度:以像素为单位设置窗口的高度。 | 自行设置窗口大小(800600) |
最大化 | 最大化当前窗口。 | | self.maximize() |
获取驱动程序名称 | 返回webdriver实例的名称。 | | self.get_driver_name() |
获取域URL | 方法从webdriver本身提取域url。 | | self.get_domain_url() |
清除文本 | 如果是文本输入元素,请清除文本 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.})。 | self.清除文本(定位器) |
截图 | 将屏幕截图保存到目录(现有或新的)。 | (a)文件路径:带有目录路径的文件名(c:/images/image.png)。 | self.capture_屏幕截图(self,filepath) |
切换到活动元素 | 返回带焦点的元素,如果没有焦点,则返回body。 | | self.switch_to_active_element() |
切换到窗口 | 使用selenium/javascript将焦点切换到指定的窗口。 | (a)要切换的窗口的名称 | 自动切换到窗口(窗口) |
将"U"切换到"U"帧 | 使用selenium/javascript将焦点切换到指定的帧。 | (a)frame name:要切换的帧的名称。 | self.切换到框架(framename) |
切换到默认内容 | 将焦点切换到默认帧。 | | self.switch_to_default_content() |
切换到警报 | 将焦点切换到页面上的警告。 | | self.switch_to_alert() |
将鼠标悬停在元素上 | 将鼠标悬停在特定元素上。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.})。 | 将鼠标悬停在元素上(定位器) |
将鼠标悬停在u上单击 | 悬停并单击特定元素。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.})。 | 将鼠标悬停在"单击"(定位器) |
等待元素 | 等待UI中存在元素。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.})。 | self.wait_for_element(定位器) |
等待并接受警报 | 等待并接受页面上的提醒。 | | self.wait_and_accept_alert() |
等待和拒绝警报 | 等待警告和拒绝。 | | self.wait_and_reject_alert() |
按索引选择选项 | 按索引选择选项。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.'})。(b)索引:索引的整数值。 | self.select_option_by_index(定位器,索引) |
按u值选择u选项 | 使用值选择选项。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.'})。(b)值:选择选项的字符串值。 | self.select_option_by_value(定位器,值) |
按文本选择选项 | 使用文本选择值。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.'})。(b)文本:选择选项的字符串值。 | self.按文本选择选项(定位器,文本) |
滚动到fooTE/< TD> | 滚动到页面末尾。 | | self.滚动至页脚() |
滚动至元素 | 滚动到页面上的特定元素。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.})。 | self.滚动至元素(定位器) |
javascript点击 | 使用javscript执行单击
| (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.})。 | Endo.java(定位器)< /TD> |
是否显示"元素" | 基于元素的返回布尔值用定位器显示。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.})。 | 是否显示元素(定位器) |
_element_是否已启用 | 基于元素的返回布尔值已通过locator启用。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.})。 | self.is_element_enabled(定位器) |
是否选择了"元素" | 返回基于元素的布尔值是用locator选择的。 | (a)定位器:标识符类型和值的字典({'by':'id','value':'start-of-content.})。 | 选择了self.is_element(定位器) |
切换到活动窗口 | 将焦点切换到新窗口 | 将焦点从当前窗口切换到新窗口 | self.switch_to_active_window() |
按索引将"U"切换到"U"帧 | 根据索引将焦点切换到指定的帧 | 框架索引 | self.switch_to_frame_by_index(索引) |
API测试模块
rest api模块方法摘要
<表><广告>
方法名 | 说明
| 参数 | 用法 |
---|
< /广告><正文>
APIRequest | 基于输入方法和kwargs触发rest api请求 | (a).方法:get/post/put/patch/delete(b).kwargs:参见下面rest-api-kwarg部分表 | self.apirest(method='get') |
断言_in_resp | 检查响应数据是否包含输入成员。 | (a)响应:验证响应。(b)成员:签入响应的值。(c)容器:以"resp."开头的点格式的响应密钥路径。示例:resp.data.0.name | self.assert_in_resp(resp,member,container) |
断言不在resp中 | 检查响应数据是否包含输入成员。 | (a)响应:验证响应。(b)成员:签入响应的值。(c)容器:以"resp."开头的点格式的响应密钥路径。示例:resp.data.0.name | self.assert_not_in_resp(resp,member,container) |
断言_等于_resp | 检查响应数据是否包含输入成员。 | (a)响应:验证响应。(b)成员:签入响应的值。(c)容器:以"resp."开头的点格式的响应密钥路径。示例:resp.data.0.name | self.assert_equal_resp(resp,member,container) |
断言不等于
| 检查响应数据是否包含输入成员。 | (a)响应:验证响应。(b)成员:签入响应的值。(c)容器:以"resp."开头的点格式的响应密钥路径。示例:resp.data.0.name | self.assert_not_equal_resp(resp,member,container) |
rest api kwarg部分
<表><广告>
参数名称 | 参数类型
| 说明
|
---|
< /广告><正文>
URL | 标准 | API请求URL |
参数 | 可选 | 字典,请求正文中要发送的元组或字节的列表。 |
数据 | 可选 | 要在请求正文中发送的字典、元组列表、字节或类似文件的对象。 |
json | 可选 | 要在请求正文中发送的JSON可序列化Python对象。 |
标题 | 可选 | 要随请求一起发送的HTTP头字典。 |
饼干 | 可选 | 要随请求一起发送的dict或cookiejar对象。 |
文件 | 可选 | "name"字典:用于多部分编码上载的类似文件的对象(或{'name':文件元组})。文件元组可以是2元组('filename',fileobj)、3元组('filename',fileobj,'content_type')或4元组('filename',fileobj,'content_type',custom_headers),其中"content type"是定义给定文件的内容类型的字符串,自定义头是一个类似dict的对象,包含要为文件添加的其他头。 |
认证 | 可选 | 验证元组以启用基本/摘要/自定义http验证。 |
超时(浮点或元组) | 可选 | 在放弃前等待服务器发送数据的时间(以浮点或(连接超时,读取超时)元组形式)。 |
允许重定向(bool) | 可选 | 布尔值。启用/禁用get/options/post/put/patch/delete/head重定向。默认为真。 |
代理 | 可选 | 字典映射协议到代理的url。 |
验证 | 可选 | 布尔值,在这种情况下,它控制是验证服务器TLS证书,还是验证字符串,在这种情况下,它必须是要使用的CA捆绑包的路径。默认为真。 |
流 | 可选 | 如果为false,将立即下载响应内容。 |
证书 | 可选 | 如果是字符串,则为SSL客户端证书文件(.pem)的路径。如果是元组,(证书,密钥)对。 |
实用程序
utils模块方法摘要的拼写检查器
这个utils模块的拼写检查器方法将捕获网页内容,并根据标准字典对其进行验证,以确保拼写正确。
<表><广告>
方法名 | 说明
| 参数 | 用法 |
---|
< /广告><正文>
拼写检查器 | 拼写检查。 | (a)url:网页url(b)单词:应用程序特定单词列表 | 拼写检查器(self,url,words=[]) |
L/Td> | | | |
比较模块
模块具有用于比较各种文件类型的实用方法
<表><广告>
方法名 | 说明
| 参数 | 用法 |
---|
< /广告><正文>
比较图像 | 比较图像并返回图像的结构相似性。ssim的度量值在0-1.0之间返回,其中1.0是最相同的,0是完全不同的。 | a)源图像路径。b)目标图像路径。 | 自我。比较图像(源、目标) |
比较json | 比较JSON文件并返回目标与源的差异字典。 | a)源json。b)目标json | 自我。比较json(源,目标) |
比较文件 | 比较两个文件并返回xl差异(如果有)。支持的文件类型是xls或xlsx csv | a)源文件路径。b)目标文件路径。 | 自我比较文件(源文件、目标文件) |
欢迎加入QQ群-->: 979659372
推荐PyPI第三方库