前言:自行模拟赛,自己写的,可以一起讨论学习,感觉正式比赛可以先写自动测试和单元测试,这次先写的用例后面自动测试完全没时间写了
老师之前说过会有直播讲解,3月12号吧
一、题目链接
报名,参加考试就可以获得题目啦,这次的题目是一个文件夹,里面把测试环境、题目全都包含了
二、前期准备
去官网下载学生机考试工具,看上一期的吧
三、功能测试
1.正交实验法
这个题目是要用混合型正交表。
2.用例编写20条
3.编写缺陷报告14条
四、自动化测试
add_post_page.py
from selenium.webdriver.common.by import By
from time import sleep
"""
* Page3-【管理页面】
* 需实现该页面中如下 5 个方法的操作代码
*
* 1.点击【+新增】元素操作方法
* 2.表单框输入【岗位名称】的方法
* 3.表单框输入【岗位编码】的方法
* 4.表单框输入【显示顺序】的方法
* 5.点击【确定】按钮的方法
*
* 注意1:不要在 Page 页的方法中填写 iframe 的切换代码。
* 注意2:注意不要改动已经写好的方法名。
*
*
"""
class AddPostPage:
def __init__(self, driver):
self.driver = driver
def click_add_button(self):
# TODO 请实现点击【+新增】元素操作方法
self.driver.find_element(By.XPATH, "/html/body/div/div/div[2]/div[1]/div[1]/div[1]/div/a[1]").click()
sleep(1)
def input_post_name(self, post_name):
# TODO 请实现表单框输入【岗位名称】的方法
post_name_input = self.driver.find_element(By.XPATH, '//*[@id="postName"]')
post_name_input.clear()
post_name_input.send_keys(post_name)
def input_post_code(self, post_code):
# TODO 请实现表单框输入【岗位编码】的方法
post_code_input = self.driver.find_element(By.XPATH, '//*[@id="postCode"]')
post_code_input.clear()
post_code_input.send_keys(post_code)
def input_post_sort(self, post_sort):
# TODO 请实现表单框输入【显示顺序】的方法
post_sort_input = self.driver.find_element(By.XPATH, '//*[@id="postSort"]')
post_sort_input.clear()
post_sort_input.send_keys(post_sort)
def click_ok_button(self):
#TODO 请实现点击【确定】按钮的方法
self.driver.find_element(By.XPATH, '/html/body/div[4]/div[3]/a[1]').click()
post_management_page.py
from selenium.webdriver.common.by import By
from time import sleep
"""
* Page2-【岗位管理页面】
* 需实现该页面中如下 7 个方法的操作代码(以下元素位置可参照题目附图)
*
* 1.获取登录后的【蓝桥超管】文本值
* 2.点击【系统管理】 > 点击【岗位管理】 的菜单路径
* 3.定位搜索项中的【岗位编码】输入框 ,并输入参数post_code
* 4.点击【搜索】按钮方法
* 5.获取搜索结果的【分页显示信息文本值】
* 6.点击搜索列表【删除】按钮
* 7.点击【确认】删除的按钮
* 注意1:不要在 Page 页的方法中填写 iframe 的切换代码。
* 注意2:注意不要改动已经写好的方法名。
"""
class PostManagementPage:
def __init__(self, driver):
self.driver = driver
def get_username_text(self):
# TODO 请实现 获取【蓝桥超管】文本值,注意在此方法中添加返回值
get_username_text = self.driver.find_element(By.XPATH, "/html/body/div/div/div[1]/nav/ul/li[3]/a/span").text
return get_username_text
def click_post_manage_path(self):
# TODO 请依次实现点击【系统管理】 > 点击【岗位管理】 的路径方法
self.driver.find_element(By.XPATH, "/html/body/div/nav/div[2]/div[1]/ul/li[3]/a/span[1]").click()
sleep(1)
self.driver.find_element(By.XPATH, "/html/body/div/nav/div[2]/div[1]/ul/li[3]/ul/li[5]/a").click()
sleep(1)
def input_post_code_search(self, post_code):
# TODO 请实现搜索条件【岗位编码】输入框的方法,post_code 为输入参数
post_code_search_input = self.driver.find_element(By.XPATH, "/html/body/div/div/div[1]/form/div/ul/li[1]/input")
post_code_search_input.clear()
post_code_search_input.send_keys(post_code)
def click_search_button(self):
# TODO 请实现点击【搜索】按钮的方法
self.driver.find_element(By.XPATH, "/html/body/div/div/div[1]/form/div/ul/li[4]/a[1]").click()
sleep(1)
def get_page_numberText(self):
# TODO 请实现 获取【分页显示信息文本值】的操作方法,注意在此方法中添加返回值
get_page_numberText = self.driver.find_element(By.XPATH, "/html/body/div/div/div[2]/div[1]/div[3]/div[1]/span").text
return get_page_numberText
def click_delete_button(self):
# TODO 请实现点击【删除】按钮的方法
self.driver.find_element(By.XPATH, "/html/body/div/div/div[2]/div[1]/div[2]/div[2]/table/tbody/tr/td[8]/a[2]").click()
def click_ok_button(self):
# TODO 请实现点击【确认】删除的按钮的方法
self.driver.find_element(By.CSS_SELECTOR, ".layui-layer-btn0").click()
test_web_case.py
这里85行这里的代码要注意一下,self.driver.switch_to.default_content()#这句一定要写!!!
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
"""
* 请按照操作步骤编写测试用例
*
* 用例要求:
* 1.合理使用元素等待时间。
* 2.请调用 Page 类中的方法实现操作步骤。
* 3.合理使用 iframe 切换,iframe 切换的代码填写在此文件中。
* 4.不要改动已经写好的方法名。
*
"""
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()
# 填写被测站点地址
self.driver.get("http://localhost:8090/login")
# 请再此方法中续写测试用例代码
def test_browser(self):
# 创建LoginPage对象,供调用该类中的方法实现【登录】的操作代码
login_page = LoginPage(self.driver)
# 点击登录账号输入框并输入账户-admin
login_page.input_login_name("admin")
# 点击登录密码输入框并输入密码-LQ15Mock2@2004
login_page.input_login_password("LQ15Mock2@2004")
# 点击验证码输入框并输入-666
login_page.input_code("666")
# 点击登录按钮
login_page.click_login_button()
sleep(2)
# 创建PostManagementPage对象
post_management_page = PostManagementPage(self.driver)
# 创建PostManagementPage对象
add_post_page = AddPostPage(self.driver)
# TODO 请参照题目中【用例步骤】补全以下代码,调用 3 个Page类中的方法实现。
# 岗位管理页面
# 获取登录后的【蓝桥超管】插入断言
get_text = post_management_page.get_username_text()
self.assertEqual("蓝桥超管", get_text,msg="正确")
# 点击【系统管理】菜单 点击【岗位管理】菜单
post_management_page.click_post_manage_path()
# 搜索项【岗位编码】输入“ceo”,请注意之后 iframe 的切换
#点击【+新增】按钮 注意此处动态 iframe 的切换
self.driver.switch_to.frame("iframe6")
add_post_page.click_add_button()
#在【岗位名称】输入框中输入“董事长”
sleep(3)
self.driver.switch_to.default_content()#这句一定要写!!!
#div_element = self.driver.find_element(By.XPATH, "div.layui-layer-iframe")
#div_element = self.driver.find_element(By.XPATH, "//*[@type='iframe']")
#iframe_element = div_element.find_element(By.CSS_SELECTOR, "iframe")
#self.driver.switch_to.frame(iframe_element)
ele = self.driver.find_element(By.XPATH, '//*[contains(@id,"layui-layer-iframe")]')
self.driver.switch_to.frame(ele)
sleep(3)
#add_post_page.input_post_name('董事长')
add_post_page.input_post_name("董事长")
#在【岗位编码】输入框中输入“ceo”
add_post_page.input_post_code("ceo")
#在【显示顺序】输入框中输入“1”
add_post_page.input_post_sort('1')
#点击【确定】按钮,请注意此处 iframe 的切换
self.driver.switch_to.default_content()
add_post_page.click_ok_button()
# 浏览器退出
def tearDown(self):
if self.driver:
self.driver.quit()
if __name__ == "__main__":
unittest.main()
五、单元测试
还是考的分支覆盖法
这里的pattern = r"^1[35678]\d{9}$" 我的理解是这个电话号码要求1开头,第二位是35678的其中一个,然后跟9为数字,一共11位。
第一步:画出流程图
第二步:把所有路径都列出来
路径 | 输入数据 | 预期结果 |
1 | 空 | False |
2 | 123456 | False |
3 | 24123456789 | False |
4 | 13123456789 | True |
第三步:写代码--Python
六、总结
功能测试这一块一定要注意时间,不注意时间很容易三个小时都花在这上面,导致自动化和单元测试没时间写,相反这两块分数也很多,尤其是单元测试,好拿分,建议先写。