测试人论坛搜索功能自动化测试
大家好,今天我们将通过一个实际的案例,学习如何进行自动化测试,我们今天以测试人论坛的搜索功能为例。在自动化测试中,定位和操作网页元素是我们需要掌握的基础技能。接下来,我们将通过分析产品、测试用例、编写脚本和优化脚本几个步骤,逐步完成整个搜索功能的自动化测试。
目录
- 产品分析
- 测试用例分析
- 编写脚本
- 脚本优化
在这个章节中,我们将分四个部分进行讲解,首先是产品分析,然后分析测试用例,接着我们将一起编写自动化测试脚本,最后讨论如何优化脚本,确保测试的稳定性和高效性。
产品分析
- 产品:测试人论坛
- 功能:搜索
https://ceshiren.com
在这个例子中,我们要测试的是“测试人论坛”的搜索功能,产品网址如屏幕所示。功能目标是验证用户在论坛首页使用搜索功能是否能顺利找到相关内容。
测试用例分析
用例标题 | 前提条件 | 用例步骤 | 预期结果 | 实际结果 |
---|---|---|---|---|
测试人搜索功能 | 进入测试人论坛首页 | 1. 点击搜索按钮 2. 输入搜索关键词 3. 点击搜索按钮 |
1. 搜索成功 2. 搜索结果列表包含关键字 |
我们先要进行测试用例分析,那么测试用例的标题就是测试人搜索功能,前提条件就是进入测试人论坛首页,然后执行以下步骤:点击搜索按钮,输入关键词,并再次点击搜索按钮来执行搜索操作。那么预期结果是搜索成功并且返回的搜索结果列表中应该包含我们输入的关键词。实际结果需要我们在测试完成后再去补充。
编写脚本
Python版本
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestCeShiRen:
def test_search(self):
# 初始化WebDriver
driver = webdriver.Chrome()
# 打开被测地址,测试人社区搜索页面
driver.get("https://www.ceshiren.com")
# 定位搜索按钮
driver.find_element(By.ID, "search-button").click()
# 定位搜索输入框,并输入搜索内容
driver.find_element(By.ID, "search-term").send_keys("appium")
# 定位搜索按钮,并点击搜索
driver.find_element(By.CSS_SELECTOR, ".show-advanced-search").click()
接下来,我们编写了一个简单的 Selenium 脚本来实现上述用例。在这个脚本中,我们首先初始化了浏览器驱动,打开了测试人论坛的首页。然后,我们模拟用户行为,点击了搜索按钮,输入了搜索关键词“appium”,最后点击了搜索按钮提交查询。
Java 版本
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class CeshirenTest {
public static WebDriver driver;
@Test
void search() throws InterruptedException {
driver = new ChromeDriver();
// 进入测试人论坛首页 前提条件
driver.get("https://ceshiren.com/");
// 1. 点击搜索按钮
driver.findElement(By.id("search-button")).click();
// 2. 输入搜索关键词
driver.findElement(By.id("search-term")).sendKeys("appium");
// 3. 点击搜索按钮
driver.findElement(By.cssSelector(".show-advanced-search")).click();
Thread.sleep(3000);
}
}
Java版本如屏幕所示,逻辑与Python版本一致,只是语言写法不同。
脚本优化-前置与后置
Python 版本
class TestCeShiRen:
def setup_class(self):
# 初始化WebDriver
self.driver = webdriver.Chrome()
def teardown_class(self):
# 退出浏览器
self.driver.quit()
def test_search(self):
# 打开被测地址,测试人社区搜索页面
self.driver.get("https://www.ceshiren.com")
# 定位搜索按钮
self.driver.find_element(By.ID, "search-button").click()
# 定位搜索输入框,并输入搜索内容
self.driver.find_element(By.ID, "search-term").send_keys("appium")
# 定位搜索按钮,并点击搜索
self.driver.find_element(By.CSS_SELECTOR, ".show-advanced-search").click()
在脚本优化的过程中,我们通过前置和后置方法来管理 WebDriver 的生命周期。首先,在 Python 版本中,我们使用 setup_class 来初始化浏览器驱动,这样每个测试类在运行之前都会创建一个新的浏览器实例。teardown_class 用来在测试执行完毕后退出浏览器,确保测试环境的清理工作。测试用例 test_search 中,首先打开了测试网站,模拟了点击搜索按钮、输入搜索内容并再次点击搜索按钮的操作,完成了搜索功能的自动化测试。通过这种方式,我们能有效地管理每个测试的前后环境,减少重复代码,提高脚本的可维护性。
Java 版本
- 前置:
BeforeAll
- 初始化浏览器驱动 - 后置:
AfterAll
- 关闭浏览器
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
// CeshirenTest+search 测试人论坛的搜索功能 对应 用例标题
public class CeshirenTest {
public static WebDriver driver;
@BeforeAll
static void setUpClass(){
driver = new ChromeDriver();
driver.get("https://ceshiren.com/");
}
@AfterAll
static void tearDownClass(){
driver.quit();
}
@Test
void search() throws InterruptedException {
driver = new ChromeDriver();
// 进入测试人论坛首页 前提条件
driver.get("https://ceshiren.com/");
// 1. 点击搜索按钮
driver.findElement(By.id("search-button")).click();
// 2. 输入搜索关键词
driver.findElement(By.id("search-term")).sendKeys("appium");
// 3. 点击搜索按钮
driver.findElement(By.cssSelector(".show-advanced-search")).click();
Thread.sleep(3000);
}
}
在 Java 版本中,为了提高测试的复用性和稳定性,我们同样可以利用 @BeforeAll 和 @AfterAll 注解方法。通过将浏览器驱动的初始化放在 @BeforeAll 注解的方法中,我们可以确保在所有测试方法运行之前只初始化一次浏览器实例;而在所有测试方法执行完毕后,我们再通过 @AfterAll 注解的方法关闭浏览器,确保清理工作得以完成。这样,我们不仅避免了每个测试方法重复创建浏览器实例,还提高了测试的效率和稳定性。
脚本优化-添加断言
Python 版本
class TestCeShiRen:
def setup_class(self):
# 初始化WebDriver
self.driver = webdriver.Chrome()
def teardown_class(self):
# 退出浏览器
self.driver.quit()
def test_search(self):
# 打开被测地址,测试人社区搜索页面
self.driver.get("https://www.ceshiren.com")
# 定位搜索按钮
self.driver.find_element(By.ID, "search-button").click()
# 定位搜索输入框,并输入搜索内容
self.driver.find_element(By.ID, "search-term").send_keys("appium")
# 定位搜索按钮,并点击搜索
self.driver.find_element(By.CSS_SELECTOR, ".show-advanced-search").click()
time.sleep(2)
# 获取该元素的文本信息
web_ele = self.driver.find_element(By.CSS_SELECTOR, ".topic-title")
title_text = web_ele.text
# 断言元素文本是否预期结果一致
assert "appium" in title_text
为了验证搜索结果的准确性,我们在脚本中加入了断言。具体来说,就是在搜索结果页面,我们获取了第一个话题的标题,并通过 assert 语句验证标题是否包含我们搜索的关键词。这一操作可以帮助我们确保搜索功能的正确性,防止因页面加载或其他问题导致测试结果不准确。
Java 版本
assertThat
语句
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
/*
* @Author: 霍格沃兹测试开发学社
* @Desc: '更多测试开发技术探讨,请访问:https://ceshiren.com/t/topic/15860'
*/
//测试人论坛的测试用例
public class CeshirenTest {
public static WebDriver driver;
// 前置、
@BeforeAll
static void setUpClass(){
driver = new ChromeDriver();
// 进入测试人论坛首页 前提条件
driver.get("https://ceshiren.com/");
}
@AfterAll
// 后置
static void tearDownClass(){
driver.quit();
}
@Test
void search() throws InterruptedException {
//1. 定位到搜索按钮 点击搜索按钮
driver.findElement(By.id("search-button")).click();
//2. 定位到输入框 输入搜索关键词
driver.findElement(By.id("search-term")).sendKeys("selenium");
//3. 定位到高级搜索按钮, 点击搜索按钮
driver.findElement(By.cssSelector(".show-advanced-search")).click();
Thread.sleep(3000);
WebElement title = driver.findElement(By.cssSelector(".topic-title"));
// 获取该元素的文本信息
String title_text = title.getText();
System.out.println(title_text);
assertThat(title_text, containsString("selenium"));
}
}
Java版本如屏幕所示,在Java 中,我们使用的方法是 assertThat 语句。
总结
在本章节中,我们通过实际的案例讲解了如何进行自动化测试脚本的编写和优化。那我们再来回顾一下我们都做了些什么,首先,我们分析了测试人论坛的搜索功能需求,并通过简单的 Selenium 操作实现了搜索功能的自动化测试。接着,我们介绍了如何通过前置和后置方法来优化脚本,避免重复创建和关闭浏览器实例,提高了测试效率和稳定性。最后,我们还演示了如何通过断言验证搜索结果的正确性,确保功能的实现符合预期。通过这些步骤,我们不仅提高了测试脚本的可复用性,还增强了其稳定性和可维护性。希望通过本章节的学习,大家能够掌握如何编写高效、稳定的自动化测试脚本,并能够在实际项目中灵活应用这些技巧。