国家重点项目建设网站,广州天华建筑设计有限公司,南京建设信息网站,wordpress添加ssl目录
1、测试概述
1.1、项目名称
1.2、测试时间
1.3、编写目的
1.4、测试范围
2、测试计划
2.1、测试用例
2.1.1、注册/登录模块
2.1.2、个人中心模块
2.1.3、找回密码模块
2.1.4、博客主列表模块
2.1.5、个人博客列表模块
2.1.6、个人草稿列表模块
2.1.7、博客详…目录
1、测试概述
1.1、项目名称
1.2、测试时间
1.3、编写目的
1.4、测试范围
2、测试计划
2.1、测试用例
2.1.1、注册/登录模块
2.1.2、个人中心模块
2.1.3、找回密码模块
2.1.4、博客主列表模块
2.1.5、个人博客列表模块
2.1.6、个人草稿列表模块
2.1.7、博客详情模块
2.1.8、博客编辑页
2.2、bug等级划分
2.3、测试环境与配置
3、测试执行
4、自动化测试
4.1、准备工作
4.2、注册自动化测试
4.3、登录自动化测试
4.4、找回密码自动化测试
4.5、个人中心自动化测试
4.6、博客列表页自动化测试
4.7、个人博客列表页自动化测试
4.8、草稿列表页自动化测试
4.9、博客详情页自动化测试
4.10、博客编辑页自动化测试
3、bug汇总
3.1、功能测试中发现的bug 3.2、兼容性测试中发现的bug
4、总结
4.1、缺陷和限制
4.2、综合评价 1、测试概述
1.1、项目名称 博客系统测试
1.2、测试时间 2023年4月13日——2023年4月。。。。
1.3、编写目的 对自己所编写的博客系统项目中所有的软件测试活动中包括测试进度、资源问题、风险进行评估总结测试活动的成功经验与不足以便今后更好的开展测试工作
1.4、测试范围
主体模块测试内容用户注册新用户、登录系统、修改密码、找回密码、个人详细信息博客博客主列表页、个人博客列表页、个人博客草稿页、博客全文 2、测试计划
2.1、测试用例
2.1.1、注册/登录模块 2.1.2、个人中心模块 2.1.3、找回密码模块 2.1.4、博客主列表模块 2.1.5、个人博客列表模块 2.1.6、个人草稿列表模块 2.1.7、博客详情模块 2.1.8、博客编辑页 2.2、bug等级划分
崩溃系统无法运行严重系统可以运行但是不稳定一般系统可以稳定运行但影响用户使用及体验感次要建议修改即可优化部分不影响用户使用和体验
2.3、测试环境与配置
服务器云服务器CentOSPC机联想yoga13s平台Windows移动端OPPO A93 - Android 浏览器Chrome、FireFox、Edge自动化测试工具Selenium Junit5 3、测试执行 界面测试使用手工测试部分使用自动化测试 安全测试使用手工测试 易用性测试使用手工测试 兼容性测试也是使用手工测试由于本人只有一部手机、一台电脑所以除了在电脑上使用Chrome进行自动化测试以外安卓的兼容性测试、电脑的不同浏览器Edge、Firefox都是用手工测试 功能测试部分使用自动化测试详情继续往下看~ 所有的手工测试在没有bug的情况下我就不写在这上面了~ 4、自动化测试
4.1、准备工作
创建一个maven项目目录 引入依赖 dependencies!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --dependencygroupIdorg.seleniumhq.selenium/groupIdartifactIdselenium-java/artifactIdversion4.2.2/version/dependencydependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter/artifactIdversion5.8.2/versionscopetest/scope/dependencydependencygroupIdorg.junit.platform/groupIdartifactIdjunit-platform-suite/artifactIdversion1.8.2/versionscopetest/scope/dependency!-- 保存屏幕截图文件需要用到的包 --dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.6/version/dependencydependencygroupIdorg.seleniumhq.selenium/groupIdartifactIdselenium-edge-driver/artifactIdversion4.2.2/versionscopetest/scope/dependency/dependencies commom包下AutoTestUtils类【封装一些公共方法方便调用】
package com.BlogAutoTest.commom;import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;import java.awt.*;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:13:02*/
public class AutoTestUtils {public static EdgeDriver driver;//创建驱动对象public static EdgeDriver createDriver() {if(driver null) {EdgeOptions options new EdgeOptions();options.addArguments(--remote-allow-origins*);driver new EdgeDriver(options);//创建隐式等待driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));}return driver;}//保存屏幕截图public static void getScreenShot(String str) throws IOException {ListString list getTime();//dirfilename//./指的是当前的项目路径下也就是BlogAutoTest下//./src/test...相对路径String filename ./src/test/java/com/BlogAutoTest/list.get(0)/ str _ list.get(1).png;File srcFile driver.getScreenshotAs(OutputType.FILE);//放到指定位置FileUtils.copyFile(srcFile,new File(filename));}public static ListString getTime() {//文件按照天的维度按文件进行保存//文件格式 20230302-123244毫秒SimpleDateFormat simpleDateFormat1 new SimpleDateFormat(yyyyMMdd-HHmmssSSS);SimpleDateFormat simpleDateFormat2 new SimpleDateFormat(yyyyMMdd);String filename simpleDateFormat1.format(System.currentTimeMillis());String dirname simpleDateFormat2.format(System.currentTimeMillis());ListString list new ArrayList();list.add(dirname);list.add(filename);return list;}}4.2、注册自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;import java.awt.*;
import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.*;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:55*/
TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RegTest {public static EdgeDriver driver createDriver();//进入页面BeforeAllpublic static void baseControl() throws InterruptedException {driver.get(http://43.139.193.116:8085/blog/reg.html);}//1------检查注册页面是否正常打开TestOrder(1)void regPageLoadRight() throws InterruptedException {driver.findElement(By.cssSelector(body div.login-container div h3));driver.findElement(By.xpath(//*[id\password2\]));driver.findElement(By.cssSelector(body div.nav a:nth-child(5)));}//2------用户名/密码为空是否有提示信息TestOrder(2)void RegFail() throws IOException, InterruptedException, AWTException {//1、直接注册driver.findElement(By.cssSelector(#username)).clear();driver.findElement(By.cssSelector(#password)).clear();driver.findElement(By.cssSelector(#password2)).clear();//2、输入用户名driver.findElement(By.cssSelector(#username)).sendKeys(cl);//3、输入密码driver.findElement(By.cssSelector(#password)).sendKeys(123);//4、输入确认密码driver.findElement(By.cssSelector(#password2)).sendKeys(123);getScreenShot(getClass().getName());driver.findElement(By.cssSelector(#submit)).click();Thread.sleep(2000);driver.switchTo().alert().accept();}//3-----正确注册TestOrder(3)void RegRight() throws IOException, InterruptedException, AWTException {driver.findElement(By.cssSelector(#username)).clear();driver.findElement(By.cssSelector(#password)).clear();driver.findElement(By.cssSelector(#password2)).clear();String username String.valueOf(System.currentTimeMillis());String password 123;driver.findElement(By.cssSelector(#username)).sendKeys(username);driver.findElement(By.cssSelector(#password)).sendKeys(password);driver.findElement(By.cssSelector(#password2)).sendKeys(password);getScreenShot(getClass().getName());driver.findElement(By.cssSelector(#submit)).click();Thread.sleep(2000);driver.switchTo().alert().accept();}}4.3、登录自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.awt.*;
import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.*;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:55*/
TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest {public static EdgeDriver driver createDriver();//打开页面BeforeAllstatic void baseControl() {driver.get(http://43.139.193.116:8085/blog/login.html);}//1-------检查页面是否正常打开TestOrder(1)void loginPageLoadRight() {driver.findElement(By.cssSelector(body div.login-container div div.msg a.m));driver.findElement(By.cssSelector(body div.login-container div div.msg a.ms));driver.findElement(By.cssSelector(body div.nav a:nth-child(4)));}//2-------登陆失败Order(2)ParameterizedTestCsvSource({zhangsan,789,lisi,789})void loginFail(String username,String password) throws InterruptedException, IOException, AWTException {driver.findElement(By.cssSelector(#username)).clear();driver.findElement(By.cssSelector(#password)).clear();driver.findElement(By.cssSelector(#username)).sendKeys(username);driver.findElement(By.cssSelector(#password)).sendKeys(password);driver.findElement(By.cssSelector(#submit)).click();Thread.sleep(2000);driver.switchTo().alert().accept();getScreenShot(getClass().getName());}//3--------登陆成功Order(3)ParameterizedTestCsvSource({cl,1118,zhangsan,123})void loginSuc(String username,String password) throws IOException, InterruptedException, AWTException {driver.findElement(By.cssSelector(#username)).clear();driver.findElement(By.cssSelector(#password)).clear();driver.findElement(By.cssSelector(#username)).sendKeys(username);driver.findElement(By.cssSelector(#password)).sendKeys(password);driver.findElement(By.cssSelector(#submit)).click();//检测是否到个人列表页driver.findElement(By.cssSelector(body div.container div.container-left div div:nth-child(4) span:nth-child(1)));driver.findElement(By.cssSelector(body div.nav a:nth-child(7)));getScreenShot(getClass().getName());driver.navigate().back();}
}4.4、找回密码自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:13:00*/
public class FindPasswordTest {public static EdgeDriver driver createDriver();BeforeAllstatic void baseControl() {driver.get(http://43.139.193.116:8085/blog/find_password.html);}Testvoid FPSWPageLoadRight() throws IOException {driver.findElement(By.cssSelector(body div.login-container div div:nth-child(4) span));driver.findElement(By.cssSelector(body div.login-container div div:nth-child(3)));getScreenShot(getClass().getName());}
}4.5、个人中心自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:58*/
public class MyCenterTest {public static EdgeDriver driver createDriver();BeforeAllstatic void baseControl() {driver.get(http://43.139.193.116:8085/blog/mycenter.html);}Testvoid MCPageLoadRight() throws IOException {driver.findElement(By.cssSelector(body div.login-container div div:nth-child(5) span));driver.findElement(By.cssSelector(body div.login-container div div:nth-child(3)));getScreenShot(getClass().getName());}
}4.6、博客列表页自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:58*/
TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogListTest {//未登录状态 登录状态//登录状态下public static EdgeDriver driver createDriver();BeforeAllstatic void baseControl() {driver.get(http://43.139.193.116:8085/blog/blog_list.html);}Testvoid BLPageLoadRight() throws IOException {driver.findElement(By.cssSelector(body div.container div div.blog-pagnation-wrapper button:nth-child(1)));driver.findElement(By.cssSelector(body div.container div div.blog-pagnation-wrapper button:nth-child(2)));getScreenShot(getClass().getName());}}4.7、个人博客列表页自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.awt.*;
import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:58*/
TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class MyBlogListTest {public static EdgeDriver driver createDriver();BeforeAllstatic void baseControl() {driver.get(http://43.139.193.116:8085/blog/myblog_list.html);}//1------检查页面加载TestOrder(1)void mListPageLoadRight() throws IOException {driver.findElement(By.cssSelector(body div.container div.container-left div div:nth-child(4) span:nth-child(1)));driver.findElement(By.cssSelector(#username));driver.findElement(By.cssSelector(body div.nav a:nth-child(7)));getScreenShot(getClass().getName());}//2------检查文章内容是否显示过长TestOrder(2)void lengthMore() {String artCount driver.findElement(By.cssSelector(#artCount)).getText();if(artCount.equals(0)) {String expect 暂无文章;String actual driver.findElement(By.cssSelector(#artDiv h3:nth-child(1))).getText();Assertions.assertEquals(expect,actual);}else {String content driver.findElement(By.cssSelector(#artDiv div:nth-child(1) div.desc)).getText();if(content.length() 200) {Assertions.assertEquals(200,content.length());}}}//3------删除博客操作TestOrder(3)void delRight() throws InterruptedException, AWTException {String artCount driver.findElement(By.cssSelector(#artCount)).getText();if(artCount.equals(0)) {//删除driver.findElement(By.cssSelector(#artDiv div:nth-child(1) a:nth-child(6))).click();Thread.sleep(2000);driver.switchTo().alert().accept();//检查页面是否还存在当前文章Thread.sleep(500);String artCount1 driver.findElement(By.cssSelector(#artCount)).getText();if(Integer.parseInt(artCount1) (Integer.parseInt(artCount)-1)) {Assertions.assertTrue(true);} else {Assertions.assertTrue(false);}}}//4------修改博客TestOrder(4)void ModRight() {String artCount driver.findElement(By.cssSelector(#artCount)).getText();if(artCount.equals(0)) {String artTitleFirst driver.findElement(By.cssSelector(#artDiv div:nth-child(1) div.title)).getText();//修改driver.findElement(By.cssSelector(#artDiv div:nth-child(1) a:nth-child(5))).click();//检查当前修改页面是否为当前文章driver.findElement(By.cssSelector(body div.blog-edit-container div.title button:nth-child(4)));
// String title driver.findElement(By.cssSelector(#title)).getAttribute(value);Assertions.assertEquals(title,artTitleFirst);
// if(title.equals(artTitleFirst)) {
// Assertions.assertTrue(true);
// } else {
// Assertions.assertTrue(false);
// }driver.navigate().back();}}//5-------查看全文TestOrder(5)void lookArt() {String artCount driver.findElement(By.cssSelector(#artCount)).getText();if(artCount.equals(0)) {
// String artTitleFirst driver.findElement(By.cssSelector(#artDiv div:nth-child(1) div.title)).getText();//查看全文driver.findElement(By.cssSelector(#artDiv div:nth-child(1) a:nth-child(4))).click();//检查文章详情页是否是当前文章//先检查页面是否加载出来了driver.findElement(By.cssSelector(body div.container div.container-right div.upvote button));driver.findElement(By.cssSelector(body div.container div.container-right div:nth-child(3) div.textarea-comment button));
// String title driver.findElement(By.cssSelector(#title)).getText();
// Assertions.assertEquals(title,artTitleFirst);}}}4.8、草稿列表页自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:12:57*/public class DraftListTest {public static EdgeDriver driver createDriver();BeforeAllstatic void baseControl() {driver.get(http://43.139.193.116:8085/blog/mydraft_list.html);}Testvoid BDraftPageLoadRight() throws IOException {driver.findElement(By.cssSelector(#username));driver.findElement(By.cssSelector(body div.container div.container-left div a));getScreenShot(getClass().getName());}}4.9、博客详情页自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.awt.*;
import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:13:01*/
TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogDetailTest {public static EdgeDriver driver createDriver();BeforeAllstatic void baseControl() {driver.get(http://43.139.193.116:8085/blog/blog_content.html?id1);}Order(1)Testvoid BDetailPageLoadRight() throws IOException {driver.findElement(By.cssSelector(body div.container div.container-right div.upvote button));driver.findElement(By.cssSelector(body div.container div.container-right div:nth-child(3) div.textarea-comment button));getScreenShot(getClass().getName());}//点赞Order(2)Testvoid VoteRight() throws InterruptedException, AWTException {String voteCount 0;String NewVote 0;try {voteCount driver.findElement(By.cssSelector(#tag)).getText();//原始点赞数} catch (NumberFormatException e) {e.printStackTrace();}//点赞driver.findElement(By.cssSelector(body div.container div.container-right div.upvote button)).click();Thread.sleep(2500);driver.switchTo().alert().accept();try {NewVote driver.findElement(By.cssSelector(#tag)).getText();//当前点赞数if(Integer.parseInt(voteCount) 0 Integer.parseInt(NewVote) 0) {if ((Integer.parseInt(NewVote) 1) Integer.parseInt(voteCount) ||(Integer.parseInt(NewVote) - 1) Integer.parseInt(voteCount)) {Assertions.assertTrue(true);} else {Assertions.assertTrue(false);}} else {Assertions.assertTrue(false);}} catch (NumberFormatException e) {e.printStackTrace();}}//评论Order(3)Testvoid CommentRight() throws InterruptedException, AWTException {String comment 很棒;//评论driver.findElement(By.cssSelector(#text-comment)).sendKeys(comment);driver.findElement(By.cssSelector(body div.container div.container-right div:nth-child(3) div.textarea-comment button)).click();Thread.sleep(2000);Alert alert driver.switchTo().alert();alert.accept();//检查String comment1 driver.findElement(By.cssSelector(#comment-list div div.comment-content)).getText();if(comment.equals(comment1)) {Assertions.assertTrue(true);} else {Assertions.assertTrue(false);}}
}4.10、博客编辑页自动化测试
package com.BlogAutoTest.Tests;import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;import java.awt.*;
import java.io.IOException;import static com.BlogAutoTest.commom.AutoTestUtils.createDriver;
import static com.BlogAutoTest.commom.AutoTestUtils.getScreenShot;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-04-15* Time:13:01*/
TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogEditTest {public static EdgeDriver driver createDriver();BeforeAllstatic void baseControl() {driver.get(http://43.139.193.116:8085/blog/blog_add.html);}TestOrder(1)void BEditPageLoadRight() throws IOException {driver.findElement(By.cssSelector(#day));driver.findElement(By.cssSelector(body div.blog-edit-container div.title button:nth-child(4)));getScreenShot(getClass().getName());}TestOrder(2)void addArt() throws InterruptedException, AWTException {String title 周一;driver.findElement(By.cssSelector(#title)).sendKeys(title);driver.findElement(By.cssSelector(#editorDiv div.editormd-toolbar div ul li:nth-child(21) a)).click();driver.findElement(By.cssSelector(#editorDiv div.editormd-toolbar div ul li:nth-child(5) a)).click();driver.findElement(By.cssSelector(body div.blog-edit-container div.title button:nth-child(6))).click();Thread.sleep(2000);driver.switchTo().alert().accept();String t driver.findElement(By.cssSelector(#artDiv div:nth-child(1) div.title)).getText();if(t.equals(title)) {Assertions.assertTrue(true);} else {Assertions.assertTrue(false);}}
}3、bug汇总
3.1、功能测试中发现的bug
模块测试版本测试环境测试步骤实际结果预期结果其他附件博客主/个人/草稿列表页Test003Chrome- 113.0.5668.0输入主页url文章简介只含正文不包括MarkDown编辑器的某些特殊字符文章简介只含正文不包括MarkDown编辑器的某些特殊字符草稿箱模块Test003Chrome- 113.0.5668.0登录-进入草稿箱个人信息栏下的文章数与草稿箱的文章数不对应个人信息栏下的文章数与草稿箱的文章数对应博客详情页Test003Chrome- 113.0.5668.0登录-查看某文章的详情页-评论评论列表无评论者的头像评论列表有评论者的头像 3.2、兼容性测试中发现的bug
模块测试版本测试环境测试步骤实际结果预期结果其他附件登录模块Test003OPPPA93-QQ浏览器13.8.0.0039输入url-回车个人博客列表模块Test003OPPPA93-QQ浏览器13.8.0.0039登录-进入个人博客列表页博客主列表页Test003OPPPA93-QQ浏览器13.8.0.0039输入url-回车草稿箱Test003OPPPA93-QQ浏览器13.8.0.0039登录-进入草稿箱博客编辑页Test003OPPPA93-QQ浏览器13.8.0.0039登录-进入写博客页个人中心Test003OPPPA93-QQ浏览器13.8.0.0039登录-进入个人中心博客详情页Test003OPPPA93-QQ浏览器13.8.0.0039通过url-进入某篇文章 结论界面设计不兼容移动端但功能支持 4、总结
4.1、缺陷和限制 该博客系统只满足了最基本的功能吸引用户量还需要拓展更多的功能例如登陆的验证码、用户头像、关注、粉丝、用户周排名、月排名、总排名、主页皮肤等等另外性能方面也存在不足还需要继续优化~
4.2、综合评价 可以上线~