目录
一.自动化测试简介
1.自动化测试是一种把人工驱动的测试行为转化为机器执行的测试过程。
2.使用自动化测试需要满足的3个条件:
(1)项目需求变动不频繁
(2)项目进度压力不大,时间不紧迫
(3)多种浏览器或平台上可以重复运行相同的测试脚本
3.自动化测试的优点
(1)提高回归测试的效率
(2)提高测试人员的利用率
(3)提高测试的精确度
(4)提高测试的便捷性
4.自动化测试的缺点
(1)不能提高测试的有效性
(2)发现的缺陷比人工测试少且不容易发现新的缺陷
二.自动化测试的常见技术
1.录制与回放技术
2.脚本技术
(1)线性脚本
(2)结构化脚本
(3)共享脚本
3.数据驱动技术
(1)关键字驱动
(2)行为驱动
三.搭建自动化测试环境
1.安装Python解释器和PyCharm
2.安装Selenium
点击设置
点加号
在搜索栏输入selenium
点击selenium然后安装就可以了
3.安装浏览器驱动
1.在Web自动化测试中,浏览器驱动通过PyCharm中的测试脚本转换为浏览器能够识别的指令来模拟用户操作网页,浏览器在接收到指令后,会通过浏览器驱动将操作结果返回到PyCharm的控制台。每一种浏览器都需要有一个特定的浏览器驱动,例如,Chrome浏览器驱动是chromedriver.exe,Firefox浏览器驱动是geckodriver.exe,IE驱动时IEDriverServer.exe
2.下面以Chrome浏览器为例,操作chromedriver.exe驱动的下载和安装过程
(1)查看Chrome版本信息
点击3个点
点击帮助,点击关于Google Chrome
(2)下载Chrome浏览器驱动
chromedriver 115及115之后版本下载地址:
Chrome for Testing availability (googlechromelabs.github.io)
四.Selenium工具的基本应用
(一)Selenium元素定位方法
find_element()方法中有两个参数,第一个参数by表示元素定位的类型,有By模块提供,默认通过ID属性来定位;第二个参数value表示元素定位类型的属性值。
from selenium.webdriver.common.by import By
from selenium import webdriver
driver = webdriver.Chrome()
url = "http://hmshop-test.itheima.net/"
driver.get(url)
driver.find_element(By.CLASS_NAME,"c-n")
下面列举调用find_element()方法定位元素的实例代码,具体如下。
driver.find_element(By.ID,"userA")
driver.find_element(By.NAME,"passwordA")
driver.find_element(By.CLASS_NAME,"telA")
driver.find_element(By.TAG_NAME,"input")
driver.find_element(By.LINK_TEXT,'访问 新浪 网站')
driver.find_element(By.PAPTIAL_LINK_TEXT,'访问')
driver.find_element(By.XPATH,'//*[@id="emailA"]')
driver.find_element(By.CSS_SELECTOR,'#emailA')
(二)Selenium常用的操作方法
1.元素的常用操作方法
方法 | 说明 |
send_keys(*value) | 输入操作方法,该方法中的参数表示输入的内容 |
clear() | 清空操作方法 |
submit() | 提交表单操作方法 |
click() | 点击操作方法 |
get(url) | 获取操作方法,url表示Web页面的资源路径 |
get_screenshot_as_file(filename) | 截图操作方法,filename是页面截图后存储的绝对路径 |
2.浏览器的常用操作方法
方法 | 说明 |
maximize_window() | 设置浏览器窗口为最大化 |
minimize_window() | 设置浏览器窗口为最小化 |
close() | 关闭浏览器窗口 |
quit() | 关闭浏览器所有窗口并退出浏览器驱动 |
3.元素等待的3种方法
(1)强制等待
强制等待通过调用sleep(seconds)函数让程序休眠一段时间,到达时间后程序再运行。函数中的参数seconds表示等待的时间,时间单位默认为秒。
(2)隐式等待
隐式等待指定位页面元素时,如果能定位到元素,则测试程序直接返回该元素,不触发等待;如果定位不到该元素,则需要等待一段时间后再定位;如果超过程序设置的最长等待时间还没有定位到指定元素,则程序会抛出元素不存在的异常(NoSuchElemenException)。在程序中设置隐式等待时间需要调用implicity_wait(timeout)方法,该方法中的参数timeout表示隐式等待的最长等待时间,单位为秒。
(3)显式等待
显式等待是指定位指定元素时,如果能定位到指定元素,则测试程序直接返回该元素,不触发等待;如果定位不到指定元素,则需要等待一段时间后再重新进行定位;如果超过程序设置的最长等待时间还没有定位到指定元素,则程序会抛出元素超时异常(TimeoutException)。实现显式等待需要调用的方法为WebDriverWait(),在程序中进行显式等待时,WebDriverWait()方法必须与until()方法或until_not()方法结合使用。
注:
until()方法用于调用一个查找元素的匿名函数,如果该函数的返回值为True,表示查找到元素;如果该函数的返回值为False,表示未查找到元素。当未查找到元素时,程序会每隔一段时间调用一次until()方法查找元素,直到查找到元素为止。
until_not()方法也用于调用一个查找元素的匿名函数,如果该函数的返回值为True,表示未查找到元素;如果该函数的返回值为False,表示查找到元素。当未查找到元素时,程序会每隔一段时间调用一次until()方法查找元素,直到查找到元素为止。
五.自动化测试框架
1.unittest框架
unittest是Python标准库自带的一个单元测试框架,无须安装即可使用。该框架主要用于管理Web自动化测试程序中的测试用例。该框架不仅提供了丰富的断言方法,便于判断每个测试用例的执行是否成功,而且可以生成测试报告便于测试人员查看测试结果。
使用unittest框架时,首先通过import在程序中导人unittest模块,然后定义一个测试类继承TestCase类,在测试类中应至少有一个可执行的测试用例,该测试用例的名称必须以test开头。
使用unittest框架需要掌握的5个基本要素:
(1)TestCase
TestCase表示测试用例,它是unittest 框架提供的一个基类。当在程序中创建一个类继承TestCase 时,该类中定义的每个测试方法都是一个测试用例,这些测试方法的名称必须以test开头。
(2)TestSuite
TestSuite表示测试套件,每个测试套件中可以包含多个测试用例。在使用测试套件时,首先在程序中创建测试套件的对象,然后调用addTest()方法将每个测试用例添加到测试套件的对象中,这样执行一个测试套件就可以执行该测试套件中存放的所有测试用例。
(3)TextTestRunner
TextTestRunner表示测试执行器,用于执行测试用例或测试套件并返回测试结果。TextTestRunner类是运行测试用例的驱动类,该类提供了run()方法来运行测试用例或测试套件。
(4)TextTestResult
TextTestResult表示测试结果,它用于展示所有用例执行成功或失败的结果信息。当程序执行完测试用例或测试套件后,TextTestResult会将测试结果输出到控制台中。
(5)Fixture
Frixture表示测试固件,用于初始化或销毁测试环境。测试固件可以理解为在测试之前或之后需要做的一些操作。例如,在执行测试之前,需要打开浏览器、设置等待时间等;在测试结束之后,需要清理测试环境、关闭浏览器、退出浏览器驱动等。
Fixture的控制级别分为方法级别、类级别和模块级别。
①Fixture的方法级别是指在测试类中定义setUp()方法与tearDown()方法,这2个方法在每个测试用例被执行前后都会被调用。
②Fixture的类级别是指在测试类中定义setUpClass()方法与tearDownClass()方法,在这2个方法上方都需要添加装饰器@classmethod,这2个方法在测试类运行前后都会被调用。
③Fixture的模块级别是指在模块中定义setUpModule()方法与tearDownModule()方法,这2个方法在模块运行前后都会被调用。
unittest框架还提供了丰富的断言方法,常用的断言方法如下
(1)assertTrue(expr):该方法用于验证expr是否为真。
(2)assertEqual(first,second):该方法用于验证first是否等于second
(3)assertlsNone(obj):该方法用于验证obj是否为None。
(4)assertIn(member,container):该方法用于验证container中是否包含member
import unittest
def my_sum(a, b):
return a + b
class MyTest(unittest.TestCase):
def test_sum(self):
result = my_sum(2, 3)
self.assertEqual(result, 5)
2.pytest框架
pytest是Python的第三方测试框架,它是unitest的护扩展框架。相较于umitet框架,pyteat框架更加简洁、高效,它能够与主流的自动化测试工具Selenium、Appium和requests等结合使用,实现Web、App和接口自动化测试。
由于pytest框架不是Python自带的自动化测试框架,所以在使用前需要先安装。打开命令提示符,执行“pip install pytest”命令安装pytest框架
在使用pytest框架时,测试类的名称要以Test开头,测试方法或函数的名称要以test开头。与unittest框架的Fixture类似,pytest框架中也有测试固件Fixture,具体如下。
(1)模块级别:Fixture的模块级别是指在模块中定义setup_module()方法与teardown_ module()方法,这2个方法分别在模块运行前后被调用,在整个模块运行中只执行一次,作用于模块中的测试用例。
(2)函数级别:Fixture的函数级别是指在模块中定义setup_function()方法与teardown_function()方法,这2个方法分别在函数运行前后被调用。
(3)类级别:Fixture的类级别是指在模块或类中定义setup_class()方法与teardown_class()方法,并在这2个方法上方添加装饰器@classmethod。 setup_class()方法与teardown_class()方法分别在类运行前后被调用,在类运行的过程中只执行一次,作用于类中的测试用例。
(4)方法级别:Fixture的方法级别是指在类中定义setup_method()方法或setup()方法、teardown_ method()方法或teardown()方法,它们分别在测试方法运行前后被调用,在每个测试方法运行的过程中只执行一次,作用于类中的所有测试方法。
pytest框架没有提供断言方法,而是直接使用Python中的assert关键字与表达式结合进行断言,pytest框架中常用的断言表达式如下。
assert a==b:用于判断a是否等于b。
assert a!=b:用于判断a是否不等于b。
assert a:用于判断a是否为真。
assert a in b:用于判断b是否包含品。
assert a>b:用于判断a是否大于b。
def add(a, b):
return a + b
class TestAdd:
def test_add(self, result=5):
assert result == add(2, 3)