项目实战
需求分析
业务场景覆盖
业务分拆多个页面
页面元素分析
难点分析
一、项目计划
(1)制定测试计划:考虑能遇见的活动集合及异常风险;制定有效的测试计划可以直接决定项目是否成功;提早构思项目异常的弥补方案
(2)测试范围:制定测试范围一定要定义清楚测试范围;范围不清晰就不知道项目什么时候完成;范围不清晰会导致标准无法确定
(3)项目设定目标:项目范围;项目设计的业务类型;项目的大小;项目的风险评估
(4)规划活动:围绕项目的目标;避免无效的活动
项目简介 |
此项目是为了自动化地实现在去哪儿网网订购火车票的目的 |
项目启动的前置条件 |
1)去哪儿网工作正常 |
2)自动化测试环境准备完毕 |
项目覆盖场景 |
场景的确定需要根据性能需求分析得出: |
1)火车票查询界面 |
2)车次列表界面 |
3)去哪儿网账号登录界面 |
4)订单信息界面 |
二、测试用例
用例ID | 模块名 | 测试的功能 | 输入 | 测试步骤 | 预期结果 | 测试结果 | 级别 |
qn_book_ticket_001 | 火车票预订 | 预订火车票 | 1、打开火车票查询网址 2、输入正确的出发站、到达站、日期等信息 3、选择正确的想要预订的车次 4、输入正确的乘客信息 | 1、正确打开火车票预订界面 2、信息可以正常输入,并输入的是正确的 3、可以正常跳转到订单页面 | 高 | ||
qn_book_ticket_02 | 火车票预订 | 预订火车票 | 1、打开火车票查询网址 2、输入错误的出发站、到达站、日期等信息 | 1、正确打开火车票预订界面 2、信息无法正常输入,或者信息可以输入但无法进行下一步操作 | 高 | ||
qn_book_ticket_03 | 火车票预订 | 预订火车票 | 1、打开火车票查询网址 2、不输入出发站、到达站、日期等信息 | 1、正确打开火车票预订界面 2、信息无法正常输入,无法进行下一步操作 | 高 |
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome("chromedriver.exe")
url = "https://www.qunar.com/"
driver.get(url)
driver.maximize_window()
action = ActionChains(driver)
#输入出发站、到达站,并且在旁边点一下
driver.find_element_by_name("fromCity").click()
driver.find_element_by_name("fromCity").send_keys("北京")
action.move_by_offset(0,0)
action.click()
action.perform()
driver.find_element_by_name("toCity").send_keys("上海")
action.move_by_offset(0,0)
action.click()
action.perform()
#先清除掉之前的日期,再输入新的日期,点集搜索
driver.find_element_by_name("fromDate").send_keys(Keys.CONTROL,"a")
driver.find_element_by_name("fromDate").send_keys(Keys.BACKSPACE)
driver.find_element_by_name("fromDate").send_keys("2022-06-01")
driver.find_element_by_class_name("button-search").click()
time.sleep(2)
#找到购买按钮,点击购买
driver.find_element_by_xpath('//*[@id="list_listInfo"]/ul[2]/li/div/div[7]/a[1]').click()
time.sleep(2)
driver.find_element_by_name("contact_name").send_keys("张三")
driver.find_element_by_name("contact_phone").send_keys("12345678901")
time.sleep(2)
driver.quit()
三、优化项目和项目分层
代码重构:测试代码层、业务代码层、基础代码层
基础代码层:
from selenium import webdriver
from datetime import date, datetime, timedelta
import xlrd
def date_n(n):
return str(date.today() + timedelta(days=int(n)))
driver = webdriver.Chrome("chromedriver.exe")
def get_driver():
return driver
# noinspection PyDeprecation
def byname(element):
return driver.find_element_by_name(element)
# noinspection PyDeprecation
def xpath(element):
return driver.find_element_by_xpath(element)
def open_url(url):
driver.get(url)
driver.maximize_window()
def close():
driver.close()
# ishead 是否有标题,有True,没有就False默认没有
def read_excel(filename, index, ishead=False):
xlsx = xlrd.open_workbook(filename)
sheet = xlsx.sheet_by_index(index)
data = []
for i in range(sheet.nrows):
if i == 0:
if ishead:
continue
data.append(sheet.row_values(i))
return data
if __name__ == '__main__':
read_excel("date.xlsx", 0, True)
业务服务层:
from selenium.webdriver.common.action_chains import ActionChains
from qunar.base_function import *
import time
from selenium.webdriver.common.keys import Keys
def book_ticket(start, end, n, name, phone):
driver = get_driver()
url = "https://train.qunar.com/"
open_url(url)
time.sleep(2)
action = ActionChains(driver)
# 输入出发站、到达站,并且在旁边点一下
byname("fromStation").clear()
byname("fromStation").send_keys(start)
action.move_by_offset(0, 0)
action.click()
action.perform().clear()
byname("toStation")
byname("toStation").send_keys(end)
action.move_by_offset(0, 0)
action.click()
action.perform()
date_1 = date_n(n)
print(date_1)
byname("date").send_keys(Keys.CONTROL, "a")
byname("date").send_keys(Keys.BACKSPACE)
byname("date").send_keys(date_1)
action.move_by_offset(0, 0)
action.click()
action.perform()
byname("stsSearch").click()
time.sleep(2)
# 找到购买按钮,点击购买
xpath('//*[@id="list_listInfo"]/ul[2]/li/div/div[7]/a[1]').click()
time.sleep(2)
byname("contact_name").send_keys(name)
byname("contact_phone").send_keys(phone)
time.sleep(2)
close()
测试代码层:
from qunar.qunar_book import book_ticket
from qunar.base_function import read_excel
import pytest
data = read_excel("date.xlsx", 0, True)
@pytest.mark.parametrize(["start", "end", "n", "name", "phone"], data)
def test_book_ticket(start, end, n, name, phone):
book_ticket(start, end, n, name, phone)
if __name__ == '__main__':
pytest.main(["-s", "test_qunar_book.py"])