目录
编写相应的测试用用例test_baidu_search_case():
项目背景
现在越来越多的测试,不仅仅需要简单的功能测试,还需要掌握一定的自动化测试能力,因此这里自己编写一个小的自动化测试脚本,用于练习
项目使用技术栈与环境
所用技术:
- Pytest (主流的自动化测试框架)
- Poium (简化page层元素的定义)
- Time (用于对当前时间的获取和处理)
- Selenium (用于获取浏览器驱动和元素定位)
- Yagmail (将生成的测试报告发送到指定邮箱)
- Click (用于进行命令行操纵)
- Os (用于目录操作)
平台与环境:
- Windows11
- Python3.8.10
- Pytest8.0.2
- Yagmail0.15.293
- Selenium4.17.2
项目功能
- 核心内容是实现对百度搜索框的一个输入内容,点击搜索之后的网页标题是否和预期的断言设置的内容一致进行自动化检测,并生成测试报告,然后以邮件的方式发送到指定邮箱的一个过程。
- 本项目的结构分为测试用例模块,生成测试报告和发送邮件三个部分,首先对测试用例进行测试,接着对测试的用例结果以测试报告的形式保存,并将其以邮件的形式发送到指定邮箱。
项目具体实施、
项目逻辑框架
相关知识科普:
Pytest的介绍:
Pytest 是一个功能强大且易于使用的 Python 测试框架,具有以下优点:
- 简单易用:Pytest 提供了简洁的语法和易于理解的测试代码结构,使得编写测试用例变得简单直观。
- 丰富的插件支持:Pytest 提供了丰富的插件系统,可以扩展其功能,例如生成测试报告、集成其他测试工具等。
- 自动发现测试用例:Pytest 可以自动发现项目中的测试用例,无需繁琐的配置,只需按照规范命名测试文件和测试函数即可。
- 丰富的断言库:Pytest 内置了丰富的断言方法,可以轻松地进行结果验证,包括比较值、异常捕获等。
- 参数化测试:Pytest 支持参数化测试,可以通过参数化装饰器来运行多组输入数据的测试用例,提高测试覆盖范围。
- 并行测试:Pytest 支持并行执行测试用例,可以加快测试执行速度,特别是在大型测试套件中。
- 丰富的报告输出:Pytest 提供多种报告输出格式,包括文本、HTML、JUnit XML 等,方便查看测试结果和分析问题。
- 与其他工具集成:Pytest 可以与其他测试工具和持续集成工具集成,如 Jenkins、Travis CI 等,实现自动化测试流程。
Poium的介绍:
Poium 是一个基于 Selenium 和 Appium 的 Python 自动化测试框架,专注于简化 Web 和移动应用测试的编写和维护
- Page Object 模式:Poium 鼓励使用 Page Object 模式来组织测试代码,将页面元素和操作封装在 Page Object 类中,提高代码的可读性和可维护性。
- 支持 Web 和移动应用:Poium 支持同时测试 Web 应用和移动应用,可以使用相同的测试框架和代码来进行跨平台测试。
- 丰富的定位方式:Poium 提供了丰富的定位方式,包括 ID、class name、xpath 等,方便定位页面元素并进行操作。
- 数据驱动测试:Poium 支持数据驱动测试,可以通过 Excel、CSV 等文件来管理测试数据,提高测试用例的覆盖范围。
- 自动化截图:Poium 提供了自动化截图功能,可以在测试失败时自动截取页面截图,方便问题定位和分析。
- 丰富的断言库:Poium 集成了丰富的断言方法,可以进行结果验证,包括比较值、元素存在性等。
- 支持多浏览器和多设备:Poium 支持在不同浏览器和设备上执行测试,可以提高测试覆盖范围。
- 集成丰富的插件:Poium 可以集成各种插件,如 allure 报告、pytest 测试框架等,扩展其功能和提高测试效率。
yagmail简介:
- Yagmail是一个强大而易于使用的Python库,通过简洁的API和许多便捷的功能,使开发人员能够轻松地通过Gmail发送电子邮件。它的简单性、支持附件和图片、OAuth2身份验证等特点,使得Yagmail在实际应用中具有广泛的用途,如自动化任务通知、应用程序报警和监控等。通过使用Yagmail库,开发人员可以提高工作效率,简化电子邮件发送过程,并实现更好的用户体验。
-
Python中的装饰器:
-
装饰器(Decorator)是Python中一种很有用的高级编程技术,它可以用来修改或扩展函数或类的行为,而不需要修改它们的源代码。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。在Python中,装饰器可以通过在函数定义前使用@decorator_name的语法来应用到函数上。当调用被装饰的函数时,实际上是在调用经过装饰器修饰后的函数
具体代码
首先编写baidu_page.py文件
from poium import Page,Element,Elements
class BaiduPage(Page):
#用于获取网页中对应的元素
search_input=Element(id_='kw',describe='搜索框')
search_button=Element(id_='su',describe='搜索按钮')
settings=Element(link_text='设置',describe='设置下拉框')
search_setting=Element(css='.pfpanel-bd',describe='搜索设置选项')
# 定位一组元素
search_result=Elements(xpath='//div/h3',describe='搜索结果')
- 说明:编写一个BaiduPage类,并继承Page,获取页面中的元素内容(测试用例用会用到的一些元素),并对获取的元素内容进行描述;
编写相应的测试用用例test_baidu_search_case():
from page.baidu_page import BaiduPage
import time
class TestSearch():
def test_baidu_search_case(self,browser,base_url): # 用到了钩子函数 browser,与base_url在conftest.py中定义
# 创建Page类的对象
page=BaiduPage(browser)
# 打开网址
page.get(base_url) # 这个get方法由Page提供
page.search_input.send_keys('pytest') # pytest是用于搜索的关键字
# 点击按钮
page.search_button.click()
time.sleep(2)
page.save_screenshot('test_baidu.png') #对搜索到的内容进行一个截图
# 断言
assert browser.title=='pytest_百度搜索'
- 说明:这里采用一个类对应一个测试用例,方便管理,首先创建page实例,调用方法,分别进行输入搜索关键字,点击按钮,以及保存截屏,最后进行断言处理。
编写配置信息文件conftest.py
import pytest
from selenium import webdriver
driver_type='chrome'
#
@pytest.fixture()
def browser():
global driver
if driver_type=='chrome':
driver=webdriver.Chrome()
elif driver_type=='firefox':
driver=webdriver.Firefox()
yield driver #yield是生成一个生成器,具有延迟的作用
driver.quit()
# 创建的是谷歌浏览器的驱动
@pytest.fixture()
def base_url():
return 'https://www.baidu.com'
- 说明:这里创建了两个函数,并都使用了装饰器@pytest.fixture(),用于返回结果,并在第一个函数中进行了浏览器的选择,这里也可以进行添加其他浏览器的驱动。
编写run_test.py文件
# coding:utf-8
import click
import time
import os
import yagmail
import pytest
def init_dir(now_time):
os.mkdir(os.getcwd()+'/test_report/'+now_time)
@click.command()
def run():
print('执行完成,生成测试结果')
now_time=time.strftime('%Y_%m-%d_%H_%M_%S')
# 创建目录
init_dir(now_time)
# 构建html测试报告的路径
html_report=os.getcwd()+'/test_report/'+now_time+'/result.html'
#使用yagmail库发送电子邮件
yag = yagmail.SMTP(user='2324460983@qq.com', password='mqjzzciuvdxcdihe', host='smtp.qq.com', port=587)
# 编写命令
pytest.main(['-v','./test_dir','--html='+html_report])
#将报告内容发送到指定的邮箱
# 邮件正文内容
content = html_report
# 主题
subject = ('百度搜索框的自动化测试报告')
# 发送邮件
yag.send(to='2324460983@qq.com', subject=subject, contents=content)
yag.close()
说明:创建init函数是为了创建一个用于存放测试报告的目录,run()函数是真正的运行函数,在其中对当前的时间进行了处理用来作为生成的测试报告的名称一部分,便于区分,这里也用到了装饰器,算是对run()函数的一个扩展,并使用yagmail模块将测试报告发送到指定邮箱。
主模块main():用于程序的运行
if __name__ == '__main__':
run()
项目效果展示
首先打开百度首页
后台代码的运行的展示
输入pytest之后点击搜索之后的界面
成功发送到指定邮箱
邮件查看
点击下载按钮下载到本地再次打开如下图所示:
到这里整个项目就结束了,通过这个项目,使得作者对于自动化测试的知识有了一定的掌握,但是因为作者也是刚开始接触这一方面,所以对一些知识的了解存在一定的片面性,所以项目的内容有限,我会继续去学习,争取下次可以对该内容进行补充。
项目的不足
- 内容丰富度:这个项目的测试用例较少,所以导致项目内容较少,后期可以添加其他的测试用例来完善该项目的充实程度。
- 流程单一:这里只是一个相对简单的断言判断和邮件的发送,后期需要添加其他流程。