我的博客系统测试设计
一、项目描述
1、采用前后端分离的来实现我的博客系统,使用MySQL 数据库存储用户和博客信息。
2、前端页面包含用户注册、登录、我的博客列表页、博客主页面、添加博客页面、修改博客页以及博客详情页;
3、我的博客系统实现了登录注册、发布博客、修改博客、查看博客详情、数量统计、删除博客、注销等主要功能。可以实现对博客记录,时间、标题、内容以及阅读量等进行查看。
二、项目功能描述
1、注册:在登陆页面点击“注册
”按钮,跳转到注册页面,注册页面输入“用户名
”、“密码
”以及“确认密码
”,首先会进行非空校验以及密码一致性校验,然后会根据用户名查看用户是否存在,如不存在,则加入数据库中,注册成功,点击弹窗,进入登录界面;如果存在会返回提示信息,注册失败。
2、登录:输入用户名和密码,首先会进行非空校验,为空则给出提示信息;如果不为空则查询数据库用户名是否存在,存在的话就校验密码是否正确,两个都校验通过则登陆成功,点击弹窗进入我的博客列表页面;如果用户名不存在或者密码错误,则提示“用户名或密码错误”,登录失败,点击弹窗,停留在登录界面。
3、写博客:在我的博客列表页面,点击写博客按钮,进入添加博客页面,输入博客标题以及博客内容,点击发布文章,这个时候会弹窗“添加成功!是否继续添加
?”点击“是
”,则停留在添加博客页面,点击“否
”,则进入带我的博客列表页面,并且第一条博客是我最新添加的博客。
4、查看详情:在我的博客列表页,点击第一条最新添加的博客,进入博客详情页面,展示当前博客的标题、内容、发布时间以及阅读量等信息。每浏览一次阅读量+1;
5、修改博客:在我的博客博客列表页面点击修改博客按钮,那么会进入博客编辑页,此时编辑页的标题以及正文的内容就是我所点击的博客的标题和正文。
6、删除博客:在我的博客列表页面,点击每个博客对应的删除按钮,则会删除该博客,并且文章数量-1;
7、博客主页:博客主页是分页展示所有的博客,也可以对博客进行查看详情,如果在首页,点击首页按钮,提示“已经在首页了
”;如果只有一页,点击上一页,下一页,末页都不跳转,如果页面数量不是1页,点击相应的页面跳转按钮,会有相应的页面切换。
8、退出登录:点击注销按钮,会提示弹窗“确认注销?
”,点击确认则进入登录界面,点击取消则不退出登录,保留在当前页面。
三、测试计划
1、功能测试
1.1 测试用例
1.2 测试步骤
(1)注册测试
正常注册测试:
RegSuccess.csv
文件:
xulin, 123456, 123456, http://localhost:8080/login.html, http://localhost:8080/reg.html
@Order(3)
@ParameterizedTest
@CsvFileSource(resources = "RegSuccess.csv")
void regSuccess(String uname, String pwd, String pwd2, String login_url, String reg_url) throws InterruptedException {
//打开博客登陆页面
webDriver.get(login_url);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//找到注册按钮
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
//进入到注册页面
// 获取 页面的url 看是不是等于 “http://localhost:8080/reg.html”
String curUrl = webDriver.getCurrentUrl();
Assertions.assertEquals(reg_url,curUrl);
//输入账号
webDriver.findElement(By.cssSelector("#username")).sendKeys(uname);
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(pwd);
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//输入确认密码
webDriver.findElement(By.cssSelector("#password2")).sendKeys(pwd2);
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//点击注册
webDriver.findElement(By.cssSelector("#submit")).click();
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//这里会有“注册成功”弹窗 确认
sleep(2000);
webDriver.switchTo().alert().accept();
//页面跳转到登录
// 获取 页面的url 看是不是等于 “http://localhost:8080/login.html”
curUrl = webDriver.getCurrentUrl();
Assertions.assertEquals(login_url, curUrl);
}
异常注册测试:
RegFailed.csv
文件:
lisi, 1234, 1234, http://localhost:8080/login.html, http://localhost:8080/reg.html
"", 1234, 1234, http://localhost:8080/login.html, http://localhost:8080/reg.html
lisi, "", 1234, http://localhost:8080/login.html, http://localhost:8080/reg.html
lisi, 123456, 1234, http://localhost:8080/login.html, http://localhost:8080/reg.html
@Order(2)
@ParameterizedTest
@CsvFileSource(resources = "RegFailed.csv")
void regFailed(String uname, String pwd, String pwd2, String login_url, String reg_url) throws InterruptedException {
//打开博客登陆页面
webDriver.get(login_url);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//找到注册按钮
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
//进入到注册页面
// 获取 页面的url 看是不是等于 “http://localhost:8080/reg.html”
String curUrl = webDriver.getCurrentUrl();
Assertions.assertEquals(reg_url,curUrl);
//输入账号
webDriver.findElement(By.cssSelector("#username")).sendKeys(uname);
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(pwd);
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//输入确认密码
webDriver.findElement(By.cssSelector("#password2")).sendKeys(pwd2);
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//点击注册
webDriver.findElement(By.cssSelector("#submit")).click();
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//这里会有“注册失败”弹窗 确认
sleep(2000);
webDriver.switchTo().alert().accept();
//页面跳转到登录
// 获取 页面的url 看是不是等于 “http://localhost:8080/reg.html”
curUrl = webDriver.getCurrentUrl();
Assertions.assertEquals(reg_url, curUrl);
}
(2)登录测试
正常登录测试:
/**
* 输入正确的账号、密码 登陆成功
*/
// @Test
@Order(3)
@ParameterizedTest
@CsvFileSource(resources = "LoginSuccess.csv")
//@CsvSource( {"lisi, 123, http://localhost:8080/myblog_list.html"})
void loginSuccess(String uname, String pwd, String blog_list_url) throws InterruptedException {
//打开博客登陆页面
webDriver.get("http://localhost:8080/login.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//输入账号
webDriver.findElement(By.cssSelector("#username")).sendKeys(uname);
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(pwd);
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//点击登录
webDriver.findElement(By.cssSelector("#submit")).click();
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//这里会有“登陆成功”弹窗 确认
sleep(2000);
webDriver.switchTo().alert().accept();
//页面跳转到列表页
// 获取 页面的url 看是不是等于 “http://localhost:8080/myblog_list.html”
String curUrl = webDriver.getCurrentUrl();
Assertions.assertEquals(blog_list_url, curUrl);
//列表页展示用户信息 lisi
//获取用户名
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
String curUName = webDriver.findElement(By.cssSelector("#username")).getText();
Assertions.assertEquals(uname, curUName);
}
异常登录测试:
LoginFailed.csv 文件
:
lisi, 1234, http://localhost:8080/login.html
"", 123, http://localhost:8080/login.html
lisi, "", http://localhost:8080/login.html
xulin, 123, http://localhost:8080/login.html
@Order(4)
@ParameterizedTest
@CsvFileSource(resources = "LoginFailed.csv")
void loginFailed(String uname, String pwd, String login_url) throws InterruptedException {
//打开博客登陆页面
webDriver.get(login_url);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//输入账号
webDriver.findElement(By.cssSelector("#username")).sendKeys(uname);
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys(pwd);
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//点击登录
webDriver.findElement(By.cssSelector("#submit")).click();
//sleep(200);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//这里会有“登陆失败”弹窗 确认
sleep(2000);
webDriver.switchTo().alert().accept();
//页面跳转到列表页
// 获取 页面的url 看是不是等于 “http://localhost:8080/login.html”
String curUrl = webDriver.getCurrentUrl();
Assertions.assertEquals(login_url, curUrl);
}
(3)发布博客测试
正常发布测试:
@ParameterizedTest
@CsvSource({"http://localhost:8080/myblog_list.html"})
void addBlog(String myBlog_url) throws InterruptedException {
//获取当前文章数量
String text = webDriver.findElement(By.cssSelector("#artcount")).getText();
int blogNum = Integer.parseInt(text);
//找到 “写博客”按钮 点击
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//进入添加博客界面
// 通过Js讲鼻涕进行输入
((JavascriptExecutor) webDriver).executeScript("document.getElementById(\"title\").value=\"我的测试\"");
sleep(3000);
//*[@id="editorDiv"]/div[1]/div[5]/div[1]/div/div
//找到输入框
//#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div
WebElement input = webDriver.findElement(By.cssSelector("#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre > span > span"));
new Actions(webDriver).moveToElement(input).click().sendKeys("我的测试数据我的测试数据").perform();
sleep(2000);
webDriver.findElement(By.cssSelector("#submit")).click();
//显示等待 等待confirm 弹窗出现
Wait<WebDriver> wait = new WebDriverWait(webDriver, Duration.ofSeconds(2));
wait.until(ExpectedConditions.alertIsPresent());
//弹窗处理
webDriver.switchTo().alert().dismiss();
//我的博客列表页面
String currentUrl = webDriver.getCurrentUrl();
Assertions.assertEquals(myBlog_url,currentUrl);
//博客数量
text = webDriver.findElement(By.cssSelector("#artcount")).getText();
int newBlogNum = Integer.parseInt(text);
Assertions.assertEquals(blogNum,newBlogNum-1);
}
异常发布测试:
/**
* 不输入标题进行发布文章
* @param mybloglist_url
* @throws InterruptedException
*/
@Order(3)
@ParameterizedTest
@CsvSource({"http://localhost:8080/myblog_list.html"})
void addBlogFailed(String mybloglist_url) throws InterruptedException {
//找到 “写博客”按钮 点击
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// 通过Js讲鼻涕进行输入 标题为空
((JavascriptExecutor) webDriver).executeScript("document.getElementById(\"title\").value=\"\"");
sleep(3000);
//发布文章按钮
webDriver.findElement(By.cssSelector("#submit")).click();
//提示请输入标题
webDriver.switchTo().alert().accept();
String currentUrl = webDriver.getCurrentUrl();
Assertions.assertNotEquals(mybloglist_url, currentUrl);
}
(4)博客详情测试
public static Stream<Arguments> Generator() {
return Stream.of(Arguments.arguments("http://localhost:8080/blog_content.html", "博客正文", "我的测试"));
}
@Order(4)
@ParameterizedTest
@MethodSource("Generator")
void blogDetail(String expected_url, String expected_title, String expected_blog_title) {
//找到第一篇博客的查看全文按钮
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
webDriver.findElement(By.xpath("//*[@id=\"artListDiv\"]/div[1]/div[4]/a[1]")).click();
//获取第一篇博客详情页面的 url
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//这里是因为第一篇博客的详情页后面是带有blogid参数的 所以每次都不同
// 只需要比较前面的部分 截取实际的url前面的部分 与期望的url 进行比较
// currentUrl.substring(0,expected_url.length());
String currentUrl = webDriver.getCurrentUrl().substring(0, expected_url.length());
//获取详情页(正文页)的页面的title
String title = webDriver.getTitle();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//获取第一篇博客的title 也就是刚刚发布的博客
String blogTitle = webDriver.findElement(By.cssSelector("#title")).getText();
webDriver.getCurrentUrl().substring(0, expected_url.length());
Assertions.assertEquals(expected_url, currentUrl);
Assertions.assertEquals(expected_title, title);
Assertions.assertEquals(expected_blog_title, blogTitle);
}
(5)博客修改测试
EditSuccess.csv
文件:
http://localhost:8080/blog_edit.html, 博客编辑, 我的测试, http://localhost:8080/myblog_list.html
/**
* 修改博客
* @param expected_edit_url
* @param expected_title
* @param expected_blog_title
* @param expected_myblog_url
* @throws InterruptedException
*/
@Order(5)
@ParameterizedTest
@CsvFileSource(resources = "EditSuccess.csv")
void blogEdit(String expected_edit_url, String expected_title, String expected_blog_title, String expected_myblog_url) throws InterruptedException {
webDriver.get(expected_myblog_url);
//找到第一篇博客的查看全文按钮
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
webDriver.findElement(By.xpath("//*[@id=\"artListDiv\"]/div[1]/div[4]/a[2]")).click();
//获取第一篇博客编辑页面的 url
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//这里是因为第一篇博客的详情页后面是带有blogid参数的 所以每次都不同
// 只需要比较前面的部分 截取实际的url前面的部分 与期望的url 进行比较
// currentUrl.substring(0,expected_url.length());
String currentUrl = webDriver.getCurrentUrl().substring(0, expected_edit_url.length());
//获取编辑页的页面的title
String title = webDriver.getTitle();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//获取第一篇博客的title 也就是要编辑的博客的title
String blogTitle = webDriver.findElement(By.cssSelector("#title")).getAttribute("value");
// 通过Js 获取title 的内容
//String blogTitle = (String) ((JavascriptExecutor) webDriver).executeScript("document.getElementById(\"title\").value");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(expected_edit_url, currentUrl);
Assertions.assertEquals(expected_title, title);
Assertions.assertEquals(expected_blog_title, blogTitle);
//修改数据(标题)
// 通过Js讲鼻涕进行输入 标题为空
((JavascriptExecutor) webDriver).executeScript("document.getElementById(\"title\").value=\"我的测试(修改版)\"");
sleep(3000);
//点击保存文章按钮
webDriver.findElement(By.cssSelector("button")).click();
//显示等待 等待alert弹窗出现
Wait<WebDriver> wait = new WebDriverWait(webDriver, Duration.ofSeconds(2));
wait.until(ExpectedConditions.alertIsPresent());
webDriver.switchTo().alert().accept();
//到了我的博客列表页面
currentUrl = webDriver.getCurrentUrl();
Assertions.assertEquals(expected_myblog_url, currentUrl);
}
(6)博客删除测试
/**
* 删除博客
* @param expect_myblog_url
*/
@Order(6)
@ParameterizedTest
@CsvSource({"http://localhost:8080/myblog_list.html"})
void deleteBlog(String expect_myblog_url) {
//获取页面的文章数量
String blogNumStr = webDriver.findElement(By.cssSelector("#artcount")).getText();
//转化为数字
int blogNum = Integer.parseInt(blogNumStr);
//找到“删除”按钮 然后点击
webDriver.findElement(By.xpath("//*[@id=\"artListDiv\"]/div[1]/div[4]/a[3]")).click();
//处理 alert 弹窗
//显示等待 等待alert 弹窗出现
Wait<WebDriver> wait = new WebDriverWait(webDriver, Duration.ofSeconds(2));
wait.until(ExpectedConditions.alertIsPresent());
webDriver.switchTo().alert().accept();
//此时的页面应该还是 我的博客列表页
String currentUrl = webDriver.getCurrentUrl();
//此时的文章数量应该少了 1
blogNumStr = webDriver.findElement(By.cssSelector("#artcount")).getText();
int newBlogNum = Integer.parseInt(blogNumStr);
Assertions.assertEquals(expect_myblog_url, currentUrl);
Assertions.assertEquals(blogNum - 1, newBlogNum);
}
(7)注销测试
注销失败:
/**
* 注销登录 点击取消注销弹窗
* @param begin_url
*/
@Order(7)
@ParameterizedTest
@CsvFileSource(resources = "LogoutFailed.csv")
void loginOutFailed(String begin_url) {
webDriver.get(begin_url);
//找到注销按钮
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
//显示等待 等待confirm 弹窗出 现
Wait<WebDriver> wait = new WebDriverWait(webDriver, Duration.ofSeconds(2));
wait.until(ExpectedConditions.alertIsPresent());
webDriver.switchTo().alert().dismiss();
//登录界面
String currentUrl = webDriver.getCurrentUrl();
Assertions.assertEquals(begin_url, currentUrl);
}
注销成功:
/**
* 注销登录 点击确认注销弹窗
* @param begin_url
* @param end_url
*/
@Order(8)
@ParameterizedTest
@CsvFileSource(resources = "Logout.csv")
void loginOut(String begin_url, String end_url) {
webDriver.get(begin_url);
//找到注销按钮
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
//显示等待 等待confirm 弹窗出 现
Wait<WebDriver> wait = new WebDriverWait(webDriver, Duration.ofSeconds(2));
wait.until(ExpectedConditions.alertIsPresent());
webDriver.switchTo().alert().accept();
//登录界面
String currentUrl = webDriver.getCurrentUrl();
Assertions.assertEquals(end_url, currentUrl);
}
2、性能测试
使用 LoadRunner
进行简单性能测试:针对登录、编写并发布博客以及删除博客、注销等功能进行简单的性能测试。
然后在实现的过程中,插入集合点以及事务等,并通过设置来实现用户的并发操作。
2.1 性能测试
性能测试是测试人员借助测试工具模拟
软件在不同场景
下系统性能指标
是否满足需求。
2.2 性能衡量指标和相关术语
并发:①需要有大量用户 ②同一时间对系统进行请求操作
并发用户:满足并发条件之后对应的用户数量就是并发数
并发请求:满足并发条件之后对应的请求数量
响应时间:用户感受软件系统为其服务所耗费的时间
用户响应时间:
系统响应时间:
事务响应时间:程序处理一个事物花费的时间
平均响应时间: 处理一个事务所需要的时间。平均响应时间越小、响应时间平均值越小,说明处理速度越快,软件的效率就越好。
吞吐量
吞吐量是指在一次性能测试过程中网络上传输的数据量的总和。
吞吐率
单位时间内服务器处理的请求数来描述其并发处理能力,单位是 req/s
。吞吐率特指 Web 服务器单位时间内处理的请求数。
TPS(Transaction Per Second)
TPS是指每秒事务处理量
。每秒钟系统能够处理的交易或事务的数量。它是衡量系统处理能力的重要指标。TPS = 并发数/平均响应时间
QPS(Query Per Second)
每秒查询数,即控制服务器每秒处理的指定请求的数量。
点击率(Hit Per Second)
指每秒发送的HTTP请求的数量。点击率越大对server造成的压力就越大。
思考时间(Think Time)
也称休眠时间
。指用户在操作时,每个请求之间的时间间隔。
事务
用户自定义的一个标识,用来度量服务器响应时间的任务或操作集,事务时间反映的是一个操作过程的响应时间。
事务的处理过程可以理解为:发送请求-->网络传输-->收到响应
集合点
模拟系统上较重用户负载时,配置多个用户同时执行操作,当用户到达集合点时将进行等待,直到指定数量的虚拟用户到达后再进行用户并发操作。根JUC下的CyclicBarrier
机制类似。
检查点
一般与事务相配合使用,作用为在编译录制脚本、replay脚本的时候用来检查脚本执行情况,检查特定的文本字符串或图片。
2.3 录制测试脚本
安装LoadRunner
,然后安装成功有三个组件:
VUG:录制脚本。
Controller:设计场景,运行场景。
Analysis:产生性能测试报告。
① 首先打开VUG,录制脚本
录制完脚本之后对无关系统的代码进行删除。
② 编译回放
编译之后没问题可以进行运行回放
③ 脚本加强
插入事务
在登录操作之前插入事务:lr_start_transaction("login");
插入结束事务:lr_end_transaction("login", LR_AUTO);
事物名称必须相同,否则会报错
查看日志:Duration: 0.1873 Wasted Time: 0.0077
事务的持续时间以及结束时间
插入集合点
多个用户到达某个点的时间点不一样,为了让多个用户达到某个测试点之后同时发起请求,插入集合点,达到并发的效果。
插入检查点
检验页面的元素,注意他是注册函数,应该放在对应的url请求之前
。
//检查点
web_reg_find("Fail=NotFound",
"Search=All",
"SaveCount=",
"Text=#",
LAST);
参数化
登录的用户名和密码可以设置成参数,因为用户名以及密码可以有多个,所以可以进行参数化。
然后设置日志:
修改运行次数:
再次运行,可以看见每次登录的用户名和密码。
打印日志
方式1:
lr_log_message("登陆成功");
方式2:
//如果当前登录的用户是“lisi“ 输出 ”hello,lisi“
if(strcmp("lisi",lr_eval_string("{username}")) == 0){
lr_output_message("hello,%s",lr_eval_string("{username}"));
}
2.4 设置场景
打开controller,添加我们录制好的脚本文件:
每隔 5s
初始化一个用户:
启动10
个虚拟用户,每隔 5s
启动一个:
让虚拟用户持续运行 5
分钟:
每隔 6s
退出2
个虚拟用户:
2.5 开始运行场景
当虚拟用户逐渐启动的时候,Running 这条折现逐渐上升,当启动完成后,趋于平稳
当用户运行完之后 此时Running 这条线每隔 5s 关闭一个用户 ,逐渐下降
Finish 这条线也会随着 Running的下降逐渐上升
2.6 在Analysis中查看性能报告以及报表
报告:
点击率:
吞吐量:
每秒点击数和吞吐量:
从图可以看出,吞吐量和点击率是有关系的,点击率上升,吞吐量也随之上升,并且吞吐量的变化发生在点击率之后。点击率下降,吞吐量也下降。
遇到的问题总结:
① 使用 VUG
录制脚本的时候,浏览器启动慢或者是脚本录制不下来,采用360极速浏览器。
② 在 VUG
中录制的脚本中,通过web_reg_find
设置检查点,发现对中文的文本识别不了。采用英文的文本进行检查点设置。