目录
1.编写测试用例 web_cases.xlsx
2.框架搭建
3.自动化用例实现
4.用例筛选
一、流程
首先,在实战之前,回顾好selenium的基础知识。77节
只要是没有现成封装的方法可以使用,都可以通过发送JS代码的方式进行操作。
1.编写测试用例 web_cases.xlsx
2.框架搭建
须知:在接口自动化测试中,已经有现成的框架,可以直接拿来用。
①common 通用模块,不以项目为转移的
可以直接将common目录直接拷贝到web自动化框架中来,(可以用,不代表一定要用,比如其中,MySQL_hanlder、request_handler不需要,web自动化中,不需要这2方面的操作,需要用的时候,可以直接复制过来用)
②config 配置文件
可以直接拷贝模块,但是内容需要根据项目情况进行修改(比如,路径、logger不需要修改, 修改账号)
③data、libs、logs、middware、reports、testcases、run.py同理
框架的搭建,基本上跟接口的框架类似
3.自动化用例实现(web自动化测试中,登录成功、登录错误的步骤是不一样的,要分开写)
编写测试用例脚本,根据web_testcases.xlsx文件进行编写。
举例:登录失败用例
步骤如下:
1.打开浏览器
2.访问登录页面
3.元素定位+元素操作,输入用户名和密码,点击登录
4.通过获取页面内容得到实际结果,进行断言
根据上述步骤,编写web自动化测试脚本(需要登录的web页面如下)
手机号为空时,显示显示“请输入手机号”,作为断言
代码实现test_login.py:
"""登录功能的测试用例""" import unittest from middware.handler import HandlerMiddle from config.config import Wait_time class TestLogin(unittest.TestCase): """登录功能的测试类""" def test_login_error(self): """测试步骤 1.打开浏览器 2.访问登录页面 3.元素定位+元素操作,输入用户名和密码,点击登录 4.通过获取页面内容得到实际结果,进行断言 :return: """ from selenium import webdriver #1.打开浏览器 driver = webdriver.Chrome() #设置隐性等待 等待的时间就可以放在config中,直接参数调用 ##方法一:放在yaml中 wait_time = HandlerMiddle.yaml_data["selenium"]["wait_time"] ##方法二、放在config.py中 #wait_time = Wait_time driver.implicitly_wait(wait_time) #2.访问登录页面 url = "http://120.78.128.25:8765/Index/login.html" driver.get(url) #3.元素定位+元素操作,输入用户名和密码,点击登录 driver.find_element_by_name("phone").send_keys("") #定位输入手机号为空 driver.find_element_by_name("password").send_keys("")#定位输入的密码为空 driver.find_element_by_class_name("btn-special").click() #4.通过获取页面内容得到实际结果,进行断言 #实际结果是在页面上的提示,再次进行定位 actual_result = driver.find_element_by_class_name("form-error-info").text #断言 self.assertTrue(actual_result == "请输入手机号")
上面代码实际结果中的text,是webelement对象直接调用的webelement.py文件中的text属性。
源码如下:
@property def text(self): """The text of the element.""" return self._execute(Command.GET_ELEMENT_TEXT)['value']
Command.GET_ELEMENT_TEXT,是Command类调用的类属性(GET_ELEMENT_TEXT = "getElementText")
总结:自动化用例,是selenium基础操作的组合,根据用例设置,操作浏览器和页面。
78节
上面是异常用例的自动化实现,下面进行正常用例的实现。
一般情况下:步骤不同,写不同的测试用例的函数(根据cases.xlsx测试用例的步骤编写)。
正常用例,以登录来说,登录成功,会跳转到登录成功的页面。与异常用例不同的是,获取实际结果跟断言
首先看下登录成功后,定位“我的账户”,通过Xpath进行定位查找,//a[@href="/Member/index.html"]
代码实现:
下面的断言,账户信息,用包含关系in:写关键字或者全称都OK,(用 ==的话,要注意查看actual_result是否与预期结果一致,这里是预期结果是写死的,后面再参数化)
def test_login_success(self): """登录成功测试用例 1.打开浏览器 2.访问登录页面 3.元素定位+元素操作,输入用户名和密码,点击登录 4.通过获取页面内容得到实际结果,进行断言 :return: """ from selenium import webdriver #1.打开浏览器 driver = webdriver.Chrome() #设置隐性等待时间 wait_time = HandlerMiddle.yaml_data["selenium"]["wait_time"] driver.implicitly_wait(wait_time) #2.访问登录页面 url="http://120.78.128.25:8765/Index/login.html" driver.get(url) #3.元素定位+元素操作,输入用户名和密码,点击登录 driver.find_element_by_name("phone").send_keys("159********") driver.find_element_by_name("password").send_keys("15******") driver.find_element_by_class_name("btn-special").click() #4.获取实际结果,进行断言 actual_result = driver.find_element_by_xpath("//a[@href='/Member/index.html']").text print(type(actual_result)) self.assertTrue("我的帐户[小蜜蜂177872141]" in actual_result)
4.用例筛选 ---引入pytest
背景:为什么进行用例筛选?
虽然实现了异常用例,但是用的比较少,因为在web自动化测试中,大多数情况下都是正向测试,主流程测试、回归测试、冒烟测试;跑主流程,比如登录成功。
所以在编写web自动化测试用例的时候,可以将用例全部编写,但是测试的时候,要进行用例筛选,只跑成功的用例。
unittest框架:将成功的用例,手动一个个添加到测试集testsuite中:suite.addTests(),比较麻烦 (接口自动化中用的是discover,自动发现全部的测试用例,这里就无法实现筛选了,所以web不能用discover)
下面引入pytest 框架
安装pytest: pip install pytest
pytest在web自动化方面更加智能,筛选用例方便 ------(pytest可以用于api,web,app自动化)
语法:(项目路径下新建个pytest.ini文件,注册标签名)
1.在筛选的方法(用例)上,加“标签”:@pytest.mark.标签名
2.终端项目路径下运行:pytest -m "标签名"
下面运行登录成功的用例结果:一共3个用例,只收集了成功的2个用例。
运行结果后谜案,有warning,打的mark标签,pytest无法识别,并给出细节查看链接,
点击链接查看:需要在pytest.ini文件中,把标签添加上去,就不会有warning信息了。
在项目路径下新建一个普通文件,命名为pytest.ini,将markers提前编写好,就不会出warning了
扩展:pytest.ini文件
pytest.ini文件是pytest的主配置文件,可以改变pytest的运行方式,它是一个固定的文件,pytest.ini文件读取配置信息,按指定的方式去运行。
pytest.ini的位置:一般放在项目工程的根目录(即当前项目的顶级文件夹下)
总结:标记功能的步骤
①先注册:在ini文件中,先注册mark的 名字
②打标签:测试用例函数上面@property.mark.标签名
③运行指定的标签用例:pytest -m "标签名"
pytest模块规则:
①自动智能发现用例:模块名以test开头、结尾(否则不会当做是测试用例)-----发现用例规则
②测试类,不能有__init__(self)初始化的方法-----测试用例的类不需要初始化
③方法(函数),必须以test_开头,类必须时Test
④pytest测试用例函数可以脱离类,可以直接使用函数的形式(测试用例的py文件直接写为函数)------unittest中无此用法
⑤类可以不继承unittest.TestSuite
(修改规则,78节50min),了解规则可以修改即可
总结:pytest的优点
①灵活的筛选用例
②不需要手动加载用例(不需要导入加载器,运行器),不需要手动添加,手动运行,直接一行运行代码即可。
③pytest可以兼容unit test(unit test不能兼容pytest)
执行测试:
1.可以在pycharm中直接右键,以pytest方式运行,但是这个pycharm解释器的特有功能,不建议使用。可以在pycharm的终端中运行
-----如果的别人需要运行自己的自动化代码,拷贝代码到本机,可以直接在terminal中,cd到该项目的根目录下,运行
2.运行 pytest testcase -sv 表示运行testcase目录下的所有的测试用例
---- 加上testcase目录,比较安全,万一别的目录中的函数有test_开头,会被pytest检测到当作用例执行了
---- -s 可以把用例中的print信息显示出来
---- -v 显示详细的测试结果在terminal (可以组合表示为-sv)
---- 生成测试报告 --html=report.html --self-contained-html (其中,如果不加--self-contained-html ,会自动生成一个目录,不需要该目录就加上该这cmd)