功能测试(70分)
{用例缺陷覆盖度+规范分}
1、测试用例(30分)+缺陷报告(40分)
2、测试用例第一条一般是全部正确输入
3、测试用例一般结果成功,用例优先级高
4、前置条件一般是打开什么页面,准备工作
5、场景法,等价类,边界值,三个方法进行用例标题设计
6、等价类,分有效和无效两种情况,无效一般都要写上去,有效看情况???因为有效用例级别高
7、用例标题设计模板【页面什么什么成功或失败(具体用例)】
8、复选框,几种情况也可以设计几条用例。
9、操作步骤:序号标明,并在相应地方标注用例说明
10、测试数据:前面需要测试的标题,后面写测试的数据,如:
11、用例级别,【中】【高】两个级别,【高】冒烟测试,正向用例(能成功的)。【中】不是【高】就是【中】
12、缺陷(进行内容输入时,要有字数提示)
13、缺陷(关闭页面,删除,修改关闭操作要有提示)
14、缺陷(提示信息和要求的要一致)
15、缺陷(看输入修改的能不能保存成功)
16、缺陷(主要负数,小数)
17、缺陷(注意跳转要正确)
18、缺陷(排序是否正确爱考)
19、要注意小细节,每个要求都要去测试
20、操作步骤:序号标明,并注意测试缺陷点
21、缺陷级别
【1】级:功能未按照需求实现;内容无法展示; 查询结果错误;删除操作未给出提示;错误提示信息不正确等。
【2】级:界面上的错误、界面布局、文字格式、按钮样式等轻微错误;辅助说明描述不清楚;提示窗口文字未采用行业术语;改进建议等。
22、黑盒测试
- 错误推测法,大纲法
- 等价值法+边界值法
边界值法:5-10位输入,应设计小于5,等于5,等于10,大于10四条用例
- 正交实验法
确定因素和水平
选择合适的正交表
把变量的值映射到表中
{加上认为可疑且没有在表中出现的组合。}
{把每一行的各因素水平的组合作为一个测试用例。}
- 场景法
确定基本流和备选流
根据基本流和各项备选流生成不同的场景
对每一个场景生成相应的测试矩阵
生成测试用例,去掉多余的测试用例,并确定测试数据值
- 判定表法(对输入条件的组合进行分析)
列出所有的条件桩和条件项
列出所有的动作桩和动作项
设计初始判定表(有条件项*条件项个规则)
简化判定表,合并相似规则,设计测试用例
第 4 步:简化判定表
- 因果图法(考虑输入条件之间的制约关系)
分析待测系统的规格说明,找出原因与结果。
明确所有原因和结果之间的制约关系以及组合关系,画出因果图。
在因果图上标记约束条件。
跟踪因果图中的状态条件,把因果图转换为判定表。
将判定表中的每一列作为依据,生成测试用例。
- 恒等:若 c1是 1,则 e1也是 1;否则 e1为 0;
- 非:若 c1是 1,则 e1是 0;否则 e1 是 1;
- 或:若 c1 或 c2 或 c3 中有一个是 1,则 e1是 1,;否则 e1为 0;
- 与:若 c1 和 c2 以及 c3 都是 1,则 e1是 1;否则 e1为 0。
E 约束(异、互斥):a、b、c 中最多有一个可能为 1,也就是 a、b、b 不能同时为 1,输入条件之间为互斥关系。但可以同时为 0。
I 约束(或、包含):a、b、c 中最少有一个必须是 1,也就是 a、b、c 不能同时为 0,输入条件之间为包含关系。但可以同时为 1。比如程序中的多选按钮。
O 约束(唯一):a、b、c 中必须有一个且仅有一个为 1。比如程序中的单选按钮。
R 约束(要求):a 是 1 时,b 必须是 1,a 为 0 时,b 的值不确定。即不可能 a 是 1 时,b 是 0。
以上 4 种是输入条件的约束,输出条件的约束只有一种,就是 M 约束:
M 约束(强制、屏蔽):若 a 是 1,则 b 强制为 0;若 a 是 0,那么 b 的值不确定。
自动化测试(50分)
{Page分+规范分(等待方法和Page页面实例化)+用例分(步用例骤+断言)}
WebDriver 初始化
from selenium.webdriver.common.by import By from time import sleep class AddPostPage: def __init__(self, driver): self.driver = driver def click_add_button(self): # TODO 请实现点击【+新增】元素操作方法 self.driver.find_element(By.XPATH, "//*[@id=\"toolbar\"]/a[1]").click() sleep(1) …… …… ……
import unittest from selenium import webdriver from selenium.webdriver.firefox.service import Service from time import sleep from selenium.webdriver.common.by import By from cn.lanqiao.web.login_page import LoginPage from cn.lanqiao.web.post_management_page import PostManagementPage from cn.lanqiao.web.add_post_page import AddPostPage class WebCaseTest(unittest.TestCase): # 浏览器初始化 def setUp(self): # 设置火狐驱动的路径,该路径不要随意改动 gecko_path = "C:\\LanQiaoTest\\project\\PythonLanqiaoTest\\driver\\geckodriver.exe" # 允许跨域访问 options = webdriver.FirefoxOptions() options.set_preference('security.fileuri.strict_origin_policy', False) options.set_preference('security.fileuri.origin_policy', '*') self.driver = webdriver.Firefox(service=Service(gecko_path), options=options) # 设置隐式等待 5 秒 self.driver.implicitly_wait(5) # 浏览器窗口最大化 self.driver.maximize_window() # TODO 请填写被测站点地址 self.driver.get("https://6614c832bcadade077beb651.hz-iframe-svc.simplelab.cn/login") # 请再此方法中续写测试用例代码 def test_browser(self): # 创建LoginPage对象,供调用该类中的方法实现【登录】的操作代码 login_page = LoginPage(self.driver) # 点击登录账号输入框并输入账户-admin login_page.input_login_name("admin") # 点击登录密码输入框并输入密码-admin123 login_page.input_login_password("admin123") # 点击验证码输入框并输入-666 login_page.input_code("666") …… …… …… # 浏览器退出 def tearDown(self): if self.driver: self.driver.quit() if __name__ == "__main__": unittest.main()
浏览器打开、关闭、窗口操作、导航操作
#浏览器打开 self.driver.get('网址') #浏览器关闭 self.driver.quit() # 设置浏览器窗口大小 driver.set_window_size(500, 800) # 后退到baidu首页 driver.back() # 前进到蓝桥首页 driver.forward() # 刷新页面 driver.refresh() #关闭当前窗口或标签页 self.driver.close() #获得当前窗口尺寸 size=driver.get_window_size() #获得当前窗口位置 position=driver.get_window_position()
时间等待的几种方式
显式等待
from selenium.webdriver.support import expected_conditions from selenium.webdriver.support import WebDriverWait webDriverWait(driver,10,1),until(expected_conditions.title_is("百度一下"))
隐式等待
driver.implicitly_wait(10)
强制等待
import time time.sleep(3)
JS 执行滚动条操作、页面元素属性的更改
from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.lanqiao.cn/') searchInputJS = 'document.getElementById("__BVID__20").value="Selenium"' driver.execute_script(searchInputJS)
上述代码中通过 JS 中的 getElementById 方法定位到了蓝桥云课首页的输入框,并通过 value 属性,定义了输入框中的内容为 "Selenium"
from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.lanqiao.cn/') scrollToJS = 'window.scrollTo(100, document.body.scrollHeight);' driver.execute_script(scrollToJS)
上述代码中通过 JS 中的 scrollTo 函数来控制滚动条滚动至页面的最下方法
模拟鼠标键盘的 Action 方法
鼠标点击操作
click(element=None) 左击 context_click(element=None) 右击 double_click(element=None) 双击 release() 释放鼠标 perform() 执行ActionChains中存储的动作
键盘操作
from selenium.webdriver.common.keys import Keys action = ActionChains(driver) action.send_keys(Keys.SPACE).perform() # 按下并释放空格键 action.send_keys(Keys.TAB).perform() # 按下并释放Tab键 action.send_keys(Keys.BACKSPACE).perform() # 按下并释放Backspace键 action.send_keys(Keys.BACKSPACE,Keys.SPACE).perform() # 连续执行按键动作 action.send_keys(Keys.TAB).send_keys(Keys.TAB).perform() # 也可以这样组合
页面元素截图和全屏截图方法
# 定位元素 element = driver.find_element(By.ID, 'element_id') # 获取元素的位置和大小 location = element.location size = element.size # 计算元素的坐标 x = location['x'] y = location['y'] width = size['width'] height = size['height'] # 截图并保存 driver.get_screenshot_as_file('screenshot.png')
# 截图并保存 driver.get_screenshot_as_file('full_screenshot.png')
异常测试、超时测试等
异常测试
assertRaises( exception, # 待验证异常类型 callable, # 待验证方法 *args, # 待验证方法参数 **kwds # 待验证方法参数(dict类型) ) #举例 self.assertRaises(Exception, self.user_service.update_password, None, None)
PO 模式
在自动化测试中,页面对象(Page Object)模式是一种设计模式,用于将页面元素的定位逻辑与测试用例分离,从而使测试更加模块化、可维护和易于扩展。
浏览器元素的基本操作、下拉框、弹出框、附件上传
点击,输入……
verifi_code=self.driver.find_element(By.XPATH,'/html/body/div[1]/div/div/div/form/div[3]/div/div/div[2]/span') code_text = verifi_code.get_attribute('textContent') code_input=self.driver.find_element(By.XPATH,'/html/body/div[1]/div/div/div/form/div[3]/div/div/div[1]/input') code_input.send_keys(code_text)
#弹出框 self.driver.switch_to.alert.text()
测试框架中注解、断言、执行顺序等
注解和断言……
执行顺序两种方法
import pytest @pytest.mark.run(order=1) def test_first(): assert True @pytest.mark.run(order=2) def test_second(): assert True
在这个例子中,
test_first()
测试用例将首先执行,然后是test_second()
。if __name__ == '__main__': suite = unittest.TestSuite() suite.addTest(UserServiceTest("def方法")) suite.addTest(UserServiceTest("def方法")) suite.addTest(UserServiceTest("def方法")) unittest.TextTestRunner().run(suite)
第二种方法
八种元素定位器、窗口切换、frame 切换
xpath……等等(注意使用完整的xpath还是xpath)
self.driver.switch_to.default_content() self.driver.switch_to.frame("iframe6")
iframe_webelement=self.driver.find_element(By.NAME,"layui-layer-iframe1") self.driver.switch_to.frame(iframe_webelement)
// 定位到iframe元素的上级 WebElement div = driver.findElement(By.xpath("/html/body/div[4]/div[2]")); //通过上级找到该下级iframe WebElement ifame = div.findElement(By.xpath("/html/body/div[4]/div[2]/iframe")); //然后再进入ifame driver.switchTo().frame(ifame);
单元测试(30分)
{25分覆盖率+5分规范分(assert断言)}
1、页面基本结构
import unittest from cn.lanqiao.send_verification_code import SendVerificationCode class SendVerificationCodeTest(unittest.testcase) def test_01(self): self.assertequal("",SendVerificationCode.is_valid()) …… if _name_=='_main_': unittest.main()
【14届国赛】有时候方法前面也会加self.
断言前面无driver
2、单元测试写流程图时要注意有真假分支
3、基本路径and并列拆分用NO连接,or并列拆分用YES连接
4、python中None,不需要引号
5、单元测试主要是看懂代码
6、好好审题
7、白盒测试
分支覆盖法
分支覆盖法是指设计适当数量的测试用例,运行被测程序,使得程序中每个判定语句的真、假分支至少被执行一次。
基本路径覆盖法
基本路径覆盖法是在程序控制流图的基础上,通过分析控制结构的圈复杂度,导出基本可执行的路径集合设计测试用例,运行被测程序,使程序的基本路径都得到覆盖。
简单循环
(1)循环 0 次:测试跳过整个循环的场景;
(2)循环 1 次:目的是检查循环的初始值是否正确;
(3)循环 2 次:目的是检查多次循环是否正确;
(4)循环 m 次(其中 2 < m < n - 1):目的是检查多次循环是否正确,这里我们也可以用等价类的思想来理解,即:可以把大于 2 次、小于 n - 1 次看成是一个等价类,m 可以是这个范围中的任意一个值,根据等价类的思想,如果这个范围中的任意一个值是不会发现程序的问题,那么,我们可以认为这个等价类中所有的值都不会发现程序的问题;
(5)循环 n - 1 次:目的是检查边界值是否正确;
(6)循环 n 次:目的是检查边界值是否正确;
(7)循环 n + 1 次:目的是检查边界值是否正确。
条件覆盖法
条件覆盖法是指设计适当数量的测试用例,运行被测程序,使得程序中每个判断语句中条件的真、假分支至少被执行一次。
分支-条件覆盖法
分支-条件覆盖是指运行代码进行测试时,程序中所有判断语句中的条件取值为真、取值为假的情况和整个判断语句取真分支、假分支的情况都被覆盖到
条件组合覆盖法
条件组合覆盖是指设计足够数据的测试用例,使每个判定语句中的所有判定条件的各种可能的组合都至少被执行一次。
路径覆盖法
路径覆盖法是指设计一定数量的测试用例运行被测程序,使程序中的所有路径都至少被执行一次。
嵌套循环
内循环
跳过循环:只有一个数时,内层循环不会执行,如:{3}
循环 1 次:当数组中有两个数字时,内层循环会循环一次,如:{21,2}
循环 2 次:当数组中有三个数字,且是按从小到大的顺序排列时,外层循环只会循环 1 次,为该层循环的最小值,而内层循环会循环两次,如:{1,2,21}
循环 m 次:根据简单循环测试用例设计的原则,如果循环没有最大循环次数,我们可以选择任意一个大于 2 的循环次数设计一个测试用例测试多次循环是否正确。这里我们设计一个循环 5 次的测试用例 ,通过分析代码的循环结构,我们可以知道,当传入6个数字,且数字是按从小到大的顺序排列时,外层循环只循环 1 次,内层循环会循环 5 次,如:{1,4,7,11,23,65}
外循环
跳过循环:只有一个数时,外层循环不会执行,如:{3}
循环 1 次:当传入的数字都是按从小到大的顺序排列时,外层循环只会循环一次,如:{1,3,5,9}
循环 2 次:当数组中的数字需要交换一次位置时,外层循环会循环两次,如:{3,9,5,48,90}
循环 m 次:可以选择任意一个大于 2 的循环次数设计一个测试用例测试外层多次循环是否正确,如:{76,2,22,59,5,155,1,90,18}
串接循环
用简单循环的方法对下面的最内层循环进行测试,将外层循环的循环次数设置为最小值 ,可以设计如下测试用例:
跳过循环:当传入的数组为空时会跳过 for 循环,即:{}
循环 1 次:当传入的数组中只有一个数字时,for 循环只会循环一次,如:{6}
循环 2k有两个数字时 for 循环会循环两次,如:{75,11}
循环 m 次:因为这个循环没有最大循环次数,所以可以选择任意一个大于 2 的循环次数设计一个测试用例测试多次循环是否正确。这里我们设计一个循环 6 次的测试用例 ,如:{20,6,90,21,45,76}
设计第二个 while 循环的测试用例:
跳过循环:当传入的数组为空或传入的数组中只有数字 1 时,会跳过 while 循环,因为测试 for 循环的时候我们已经设计了数组为空的测试用例,所以这里我们选择数组中只有数字 1 的用例,即:{1}
循环 1 次:当数组中的最大值为 2 时,while 循环只会执行 1 次,如:{2,1}
循环 2 次:当数组中的最大值为 3 或 4 时,while 循环会执行 2 次,如:{4,1,3,2}
循环 m 次:可以选择任意一个大于 2 的循环次数设计一个测试用例测试 while 循环是否正确,如:{27,5,50,2,100,11,21}
语句覆盖法
语句覆盖法是指设计适当数量的测试用例,使被测程序中的每条语句至少被执行一次。