赞
踩
表5-1 功能测试赛程表 | |||||
---|---|---|---|---|---|
功能测试赛程 | 数量 | 分值 | 考察点 | 评分标准 | 备注 |
设计测试用例 | 1 | 35 | 测试用例文档应包括:用例编号、功能模块、测试点、前提条件、操作步骤、测试数据、预期结果、用例级别等。 | 1、 按照设计的测试用例级别进行判分。用例级别分为3级,标准详见下表6-1所列。(重复项不得分)2、 测试用例编写符合测试用例规范。 | |
提交缺陷报告 | 1 | 35 | Bug提交文档包括:缺陷编号、模块、摘要、操作步骤、预期结果、实际结果、严重程度、提交人、截图等。 | 1、 按照发现的bug级别得分。Bug级别分为4级,分级标准详见下表6-2所列。(重复项不得分)2、 测试bug清单编写符合规范,每一项都需要填写,否则得0分 |
等价类划分法:有效等价类 无效等价类
边界值法:最大值,最小值,最大值+1,最小值-1
因果图法:通过因果关系图来帮助发现和定义测试用例,用于复杂的流程或者结构。
判定表法:通过列出输入条件和它们所产生的结果来生成测试用例,只关注每个输入条件和结果之间的关系
场景法:根据用户的实际操作场景,设计测试用例并重点测试活动流程。
错误推断:通过对以前发现的错误进行推断,来推断可能出现的错误情况,从而设计测试用例
1、熟悉业务,了解系统
解析:任何系统都有大的业务背景,只要熟悉了业务知识才能更有效的使用系统。任何系统在使用过程中,都有一个熟悉的过程,对系统越熟悉,越容易发现系统问题和业务问题。
2、用客观的思考方式站在用户的角度分析
解析:作为测试人员如果想提升测试用例的编写能力,首先应该做到的就是站在客户的角度分析客户需要什么和客户想要什么,客户不想要什么,也就是所谓的客户的使用场景,这样有利于我们更好的挖掘和思考隐含的需求。至于这个需求该不该做,那是需求人员的职责,这个需求做起来复不复杂那是开发人员的事情,作为测试人员需要考虑的事就是你所设计的正向和反向测试用例是不是用户常用到的场景,以及一些客户基本不会用到的场景有哪些。
3、多思考,不要拘束于惯性思维
解析:一个人做一个工作时间越久,也就是我们说的经验越丰富,可能这个思维方式就会固话。比如,测试的统计表多了,当拿到一个新增的统计表的时候,首先想到的是公用用例上所列的测试点基本上就是最全的了,我都不用思考,直接用就行了。其实这是一个误区,公用用例的目的是帮助我们减少一些不必要的内耗,但是我们的思维不要被它所限定,如果公用用例中某个点是错的,那我们岂不要一错再错了。所以作为一个测试人员如果想要提升自己的测试用例设计能力,一定要多思考,不要被这种惯性思维束缚,不要被所谓的经验束缚。
表5-2 自动化测试赛程表 | |||||
---|---|---|---|---|---|
题型 | 数量 | 分值 | 考察点 | 评分标准 | 备注 |
自动化测试编程 | 1 | 50 | - Selenium引入WebDriver- 启动浏览器- 浏览器窗口操作- 浏览器导航操作- 多种元素定位器- 元素的基本操作方法- 时间等待方法- 下拉框操作方法- Alert弹出框方法- 附件上传操作方法- 下拉滚动条方法- 窗口及Frame切换方法- 页面元素属性删除方法- 参数化和数据驱动- 断言- 模拟鼠标键盘Action方法- 页面截图操作- 读取csv文件- TestNg自动化测试框架- PO模式 | 1、 考察运行步骤:脚本设置正确,不影响运行结果。2、 运行结果分析:通过运行结果分析,验证场景所设置的参数,是否满足预期目标值。 | 主要考察工具基本操作、selenium与脚本语言的使用以及Selenium控件与参数化应用。 提前给考生提供Selenium开发环境搭建手册。Python和Java语言二选一。 |
WebDriver是Selenium的核心,可用于连接浏览器并与其交互。通常需要从selenium包中导入WebDriver。
from selenium import webdriver
在 Selenium中,可使用不同的WebDriver实现启动不同类型的浏览器。比如ChromeDriver可以用来启动谷歌浏览器,FirefoxDriver可以用来启动火狐浏览器。要根据浏览器的版本下载相应的浏览器驱动,并将驱动的位置放到浏览器的application中再添加到环境变量中。
driver = webdriver.Chrome()
# 或者手动添加浏览器位置 需先导入service包
from selenium.webdriver.chrome.service import Service
path = Service('D:\\浏览器驱动\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
通过调用Selenium的API来实现浏览器的操作
driver.maximize_window() # 最大化浏览器窗口
driver.minimize_window() # 最小化浏览器窗口
driver.set_window_size(400, 800) # 设置浏览器窗口大小为 400*800
width, height = driver.get_window_size() # 获取当前浏览器窗口大小
x, y = driver.get_window_position() # 获取当前浏览器窗口位置
driver.get("https://www.baidu.com/") # 打开指定的网页
driver.back() # 后退
driver.forward() # 前进
driver.refresh() # 刷新
driver.close() # 关闭当前窗口
driver.quit() # 关闭浏览器驱动对象 即所有程序启动的窗口
driver.title # 获取页面title
driver.current_url # 获取当前页面URL
Web页面通常包含各种对象元素,如按钮、输入框等。
八种元素定位:元素属性定位(id,name,class_name)、元素标签定位(tag_name)、超链接定位a标签(link_text,partial_link_text)、元素路径定位(XPath)、CSS选择器定位(CSS)
element = driver.find_element(By.ID, "element_id") # 按ID查找元素
element = driver.find_element(By.NAME, "element_name") # 按名称查找元素
element = driver.find_element(By.CLASS_NAME, "element_class") # 按类名查找元素
找到元素后,WebDriver提供了各种方法对其进行基本的操作,如输入、点击等。
element.send_keys("hello world") # 输入文本
element.click() # 点击元素
element.clear() # 清除输入框
element.size # 返回元素大小
element.text # 返回元素文本
element.get_attribute("name") # 获取该元素的name属性值
element.is_displayed() # 判断元素是否可见
element.is_enabled() # 判断元素是否可用
element.is_selected() # 判断元素是否选中 一般用来检查复选框或单选按钮是否被选中
显式等待
# 导包
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver,timeout=10,poll_frequency=0.5).until(lambda x:x.find_element(By, "value"))
隐式等待
driver.implicitly_wait(30)
# 导包
from selenium.webdriver.support.select import Select
# 实例化Select方法 定位到select标签上
li = Select(driver.find_element(By,"value"))
# 相关调用方法
li.select_by_index
li.select_by_value
li.select_by_visible_text
### 如果下拉框选项中有value属性 可以直接通过css定位元素,点击元素,达到选择的效果
# 实例化一个对象 切换到弹出框上 默认返回的alert对话框对象
at = driver.switch_to_alert
# 方法
at.accept() # 同意
at.dismiss() #不同意
at.text # 获取弹出框文本
# send_keys("附件路径")
driver.find_element(By,"value").send_keys("文件路径")
说明:selenium中没有直接提供操作滚动条的方法,但他提供了可执行JavaScript脚本的方法,我们可以通过JavaScript脚本来达到操作滚动条的目的
# 设置JavaScript脚本控制滚动条滚动距离 0:左边距 1000:上边距 单位为像素
js = "window.scrollTo(0,1000)"
# selenium中调用执行JavaScript脚本
driver.execute_script(js)
# 定义一个变量接收当前窗口句柄 默认为driver打开的第一个页面的窗口句柄
current_handle = driver.current_window_handle
# 定义一个列表 接收当前由driver启动的所有窗口句柄
all_handle = driver.window_handles
# 切换窗口句柄
for h in all_handle:
if h!=current_handle:
driver.switch_to.window(h)
# 切换窗口后执行完操作要返回主窗口
driver.switch_to.window(current_handle)
# 切换frame 定位到iframe上 也可直接填iframe的id、name属性 前提是该frame已经加载完成 必要时要加上显示等待
driver.switch_to.frame(driver.find_element(By,"value"))
# 表单上进行操作后返回默认表单
driver.switch_to.default_content()
# 利用显示等待定位到元素 并接收
ys = WebDriverWait(driver,timeout=10,poll_frequency=0.5).until(lambda x:x.find_element(By, "value"))
# 删除定位到的元素中的 data-example 属性
script = "arguments[0].removeAttribute('data-example')"
# 执行JavaScript
driver.execute_script(script, ys)
参数化:解决相同业务逻辑,不同数据的问题 根据需求动态获取参数并引用的过程 解决代码冗余问题
# 安装parameterized插件 导入这个包
from parameterized import parameterized
# 修饰测试函数 类型为列表嵌套元组 在测试函数中的参数设置变量引用参数值
@parameterized.expand([数据])
数据驱动:以数据来驱动整个测试用例的执行 是一种测试设计模式 将测试数据与测试逻辑分离
# 读取JSON文件 先导入json包 定义一个空列表
import json
arrs = []
with open('文件路径.json',"r", encoding='UTF-8') as f:
datas = json.load(f) # 返回的数据类型为字典或列表
for data in datas.values(): # 遍历获取到的所有字典值
arrs.append((data['a'], data['b'], data['c'])) # 获得列表格式的值
# 读取txt文件
arrs = []
with open('文件路径.txt',"r", encoding='UTF-8') as f:
datas = f.readlines()
for data in datas:
arrs.append(tuple(data.strip().split(","))) # arrs 为列表嵌套元组的值
# 读取csv文件 先导入csv包
import csv
with open("文件路径.csv", "r", encoding="utf-8") as f:
data = csv.reader(f)
for d in data:
d[0],d[1] # 每行数据为一个列表d d[0] d[1] 可获取列表中的元素
# 读取excel文件 导包
import pandas as pd
# 使用xlrd中的open_workbook方法打开excel文件
data = pd.read_excel("csv01.xlsx", sheet_name="Sheet1", header=None)
# 读取规定位置的元素
for a in (0, 1, 2): # a为行 遍历第0,1,2行
data.iloc[a,0] data.iloc[a,1] # 获取第a行 第0,1列的元素
self.assertEqual(ex1, ex2) # 判断ex1 ex2是否相等
self.assertIn(ex1, ex2) # 判断ex2 是否包含ex1
self.assertTrue(ex) # 判断ex是否为True
# 鼠标操作 先导包
from selenium.webdriver.common.action_chains import ActionChains
# 实例化对象
action = ActionChains(driver)
# 右击 双击 拖拽 悬停 等方法 最后都要加上.perform()来执行
action.context_click(driver.find_element(By,"value"))
action.double_click(driver.find_element(By,"value"))
action.drag_and_drop(source,target) # source指元素的原位置 target指拖拽之后的元素位置
action.move_to_element(driver.find_element(By,"value")) # 该方法的意思是移动到指定元素位置
# 键盘操作 先导包
from selenium.webdriver.common.keys import Keys
# 常用的键盘操作方法 直接写在元素定位之后即可
.send_keys(Keys.BACK_SPACE) # 删除键
.send_keys(Keys.SPACE) # 空格键
.send_keys(Keys.TAB) # 制表键 Tab
.send_keys(Keys.ESCAPE) # 回退键 Esc
.send_keys(Keys.ENTER) # 回车键
.send_keys(Keys.CONTROL,'a') # 全选 ctrl+a
.send_keys(Keys.CONTROL,'c') # 复制 ctrl+c
driver.save_screenshot('图片名.png')
# 存放在image文件夹中 命名为时间.png
driver.get_screenshot_as_file("../image/{}.png".format(time.strftime("%Y_%m_%d %H_%M_%S")))
TestNG是一个Java中流行的自动化测试框架,它在JUnit的基础上进行了扩展。 它支持各种测试类型,包括单元测试、功能测试、集成测试和端到端测试,并提供了大量的灵活性和可扩展性。
TestNG的一些主要功能包括:
1.支持并发测试:TestNG可以同时运行多个测试用例,并跨多个线程使用测试类或测试套件进行并发测试。
2.测试组:TestNG允许用户将测试用例分组,以便更容易地选择和运行特定的测试。
3.测试顺序:TestNG可以按特定的顺序执行测试。
4.依赖测试:TestNG允许用户定义测试之间的依赖关系,以确保一个测试在另一个测试之前运行。
5.参数化测试:TestNG允许用户通过提供不同的参数来多次运行相同的测试用例,以测试不同的输入组合。
6.报告生成:TestNG提供了丰富的测试报告,并支持多种测试报告格式,例如HTML、XML和PDF。
v1:不采用任何模式(线性模型) 问题:无法批量执行
v2:采用测试框架unittest 问题:业务脚本与页面对象没有分开
v3:业务代码和页面对象进行 问题:代码冗余量太大
v4:实际项目中的po模式编写
base(基类):存放page页面的一些公共的方法
以上方法封装时 解包只需一次 driver为虚拟 谁调用base时谁传入
page(页面对象):一个页面封装成一个对象
scripts(业务层):导包调用page页面
表5-3 单元测试赛程表 | |||||
---|---|---|---|---|---|
题型 | 数量 | 分值 | 考察点 | 评分标准 | 备注 |
单元测试 | 1 | 30 | - 语句覆盖法- 判定覆盖法- 条件覆盖法- 判定条件覆盖法- 条件组合覆盖法- 路径覆盖法- 基本路径覆盖法- Junit/UnitTest基础注解- Junit/UnitTest断言方法- Junit/UnitTest 参数化/数据驱动- Junit/UnitTest测试套件- Junit/UnitTest测试优先级顺序- Junit/UnitTest 注释- Junit/UnitTest 异常- Junit/UnitTest TestRunner内置方法- Junit/UnitTest 编码规范 | 1、 规范检查:单元测试的编码符合规范。2、 覆盖率:功能代码的测试充分覆盖。3、 框架使用:单元测试框架的掌握程度。4、 运行结果分析:通过运行结果分析,验证单元测试的通过率。 | 使用Java或Python语言编写应用程序,设计测试数据,使用Junit或者UnitTest框架对应用程序编写单元测试代码,使用设计的测试数据完成单元测试。 提前给考生提供单元测试工具及环境搭建操作手册。Python和Java语言 |
流程图—>控制流图—>环路复杂度–>测试用例—>调用、断言
环路复杂度:V(G) = P+1 (P为判断节点数) 流图中的区域数 V(G)=E-N+2 (E是流图中边的条数,N是结点数)
写测试用例要覆盖到所有的路径,且测试用例条数为环路复杂度
最后写测试代码,使用UnitTest中的测试套件
suite = unittest.TestSuite()
suite.addTest(类名('方法1'))
suite.addTest(类名('方法2'))
unittest.TextTestRunner().run(suite)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。