项目当中的测试
主要通过对 MyMusic 项目做测试,通过 Selenium 自动化套件 + JUnit 单元测试框架,来对项目的功能进行自动化测试。
项目的功能:登录、注册、修改密码、播放音乐、搜索音乐、收藏音乐、上传音乐、删除音乐。
测试用例的设计
界面测试
功能测试
性能测试
安全测试
易用性测试
兼容性测试
功能测试
我测试了项目的功能,代码如下
登陆测试
package com.example.onlinemusic.Mymusic;
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.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.time.Duration;
import java.util.Set;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest{
private static ChromeDriver driver;
private static ChromeDriver getDriver() {
if (driver == null) {
driver = new ChromeDriver();
//隐式等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
}
return driver;
}
@Test
@BeforeAll
static void start() throws InterruptedException {
driver = getDriver();
driver.get("http://49.232.4.81:8080/login.html");
Thread.sleep(2000);
}
//测试正常情况下 页面的元素是否正常
@Test
@Order(1)
public void appearance() throws InterruptedException {
System.out.println("apprearance");
String register = driver.findElement(By.cssSelector("#body > div > div:nth-child(5) > a")).getText();
Assertions.assertEquals(register, "注册账号!");
String login = driver.findElement(By.cssSelector("#submit")).getAttribute("value");
Assertions.assertEquals(login, "登录");
String mainText = driver.findElement(By.cssSelector("#body > div > h3")).getText();
Assertions.assertEquals(mainText, "登录");
driver.findElement(By.cssSelector("#body > div > div:nth-child(5) > a")).click();
String label = driver.findElement(By.cssSelector("#body > div > div:nth-child(2) > label")).getText();
Assertions.assertEquals(label, "用户名:");
String placeholder = driver.findElement(By.cssSelector("#user")).getAttribute("placeholder");
Assertions.assertEquals(placeholder, "请输入用户名");
String label1 = driver.findElement(By.cssSelector("#body > div > div:nth-child(3) > label")).getText();
Assertions.assertEquals(label1, "密码:");
String placeholder1 = driver.findElement(By.cssSelector("#password1")).getAttribute("placeholder");
Assertions.assertEquals(placeholder1, "请输入密码");
String label2 = driver.findElement(By.cssSelector("#body > div > div:nth-child(4) > label")).getText();
Assertions.assertEquals(label2, "确认密码:");
String placeholder2 = driver.findElement(By.cssSelector("#password2")).getAttribute("placeholder");
Assertions.assertEquals(placeholder2, "再次输入密码");
String button = driver.findElement(By.cssSelector("#submit")).getAttribute("value");
Assertions.assertEquals(button, "注册");
driver.navigate().back();
String label3 = driver.findElement(By.cssSelector("#body > div > div:nth-child(2) > label")).getText();
Assertions.assertEquals(label3, "用户名:");
String placeholder3 = driver.findElement(By.cssSelector("#user")).getAttribute("placeholder");
Assertions.assertEquals(placeholder3, "请输入用户名");
String label4 = driver.findElement(By.cssSelector("#body > div > div:nth-child(3) > label")).getText();
Assertions.assertEquals(label4, "密码:");
String placeholder4 = driver.findElement(By.cssSelector("#password")).getAttribute("placeholder");
Assertions.assertEquals(placeholder4, "请输入密码");
WebElement element1 = driver.findElement(By.cssSelector("#submit"));
Assertions.assertNotNull(element1);
}
//测试窗口
@Order(2)
void windowSize() throws InterruptedException {
driver.manage().window().maximize();
appearance();
driver.manage().window().minimize();
appearance();
Thread.sleep(2000);
}
//username都是错误的 4种长度密码 都不能登录 username对 4种长度密码
@ParameterizedTest
@CsvSource(value = {"a,123", "b,123", "c,123", "d,123",
"e,123", "f,123", "g,123", "h,123"})
@Order(3)
void falseLogin(String username, String password) throws InterruptedException {
driver.findElement(By.cssSelector("#user")).clear();
driver.findElement(By.cssSelector("#user")).sendKeys(username);
driver.findElement(By.cssSelector("#password")).clear();
driver.findElement(By.cssSelector("#password")).sendKeys(password);
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
}
//正确登录
@ParameterizedTest
@CsvSource(value = {"gly,123", "aaa,123", "kkk,123"})
@Order(4)
void trueLogin(String username, String password) throws InterruptedException {
String windowHandle = driver.getWindowHandle();
driver.switchTo().window(windowHandle);
driver.findElement(By.cssSelector("#user")).clear();
driver.findElement(By.cssSelector("#user")).sendKeys(username);
driver.findElement(By.cssSelector("#password")).clear();
driver.findElement(By.cssSelector("#password")).sendKeys(password);
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
Set<String> windowHandles = driver.getWindowHandles();
for(String window : windowHandles){
if(window != windowHandle){
driver.switchTo().window(window);
break;
}
}
String text = driver.findElement(By.xpath("/html/body/div[1]/h3")).getText();
Assertions.assertNotNull(text);
String text2 = driver.findElement(By.cssSelector("#submit1")).getText();
Assertions.assertEquals(text2, "查询");
driver.navigate().back();
driver.switchTo().window(windowHandle);
}
//账户名 密码为空
@Test
@Order(5)
void nullLogin() throws InterruptedException {
driver.findElement(By.cssSelector("#user")).clear();
driver.findElement(By.cssSelector("#password")).clear();
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
}
//密码为空
@Test
@Order(6)
void OneNoLogin1() throws InterruptedException {
Thread.sleep(1000);
driver.findElement(By.cssSelector("#user")).sendKeys("qqq");
driver.findElement(By.cssSelector("#password")).clear();
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(3000);
Alert alert = driver.switchTo().alert();
alert.accept();
}
//账号为空
@Test
@Order(7)
void OneNoLogin2() throws InterruptedException {
Thread.sleep(1000);
driver.findElement(By.cssSelector("#user")).clear();
driver.findElement(By.cssSelector("#password")).sendKeys("123");
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(3000);
Alert alert = driver.switchTo().alert();
alert.accept();
driver.quit();
}
}
注册测试
package com.example.onlinemusic.Mymusic;
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.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.time.Duration;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RegistTest{
private static ChromeDriver driver;
private static ChromeDriver getDriver() {
if (driver == null) {
driver = new ChromeDriver();
//隐式等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
}
return driver;
}
@Test
@BeforeAll
static void start() throws InterruptedException {
driver = getDriver();
driver.get("http://49.232.4.81:8080/login.html");
driver.findElement(By.cssSelector("#body > div > div:nth-child(5) > a")).click();
Thread.sleep(2000);
}
@Test
@Order(1)
void registUI(){
String label = driver.findElement(By.cssSelector("#body > div > div:nth-child(2) > label")).getText();
Assertions.assertEquals(label, "用户名:");
String placeholder = driver.findElement(By.cssSelector("#user")).getAttribute("placeholder");
Assertions.assertEquals(placeholder, "请输入用户名");
String label1 = driver.findElement(By.cssSelector("#body > div > div:nth-child(3) > label")).getText();
Assertions.assertEquals(label1, "密码:");
String placeholder1 = driver.findElement(By.cssSelector("#password1")).getAttribute("placeholder");
Assertions.assertEquals(placeholder1, "请输入密码");
String label2 = driver.findElement(By.cssSelector("#body > div > div:nth-child(4) > label")).getText();
Assertions.assertEquals(label2, "确认密码:");
String placeholder2 = driver.findElement(By.cssSelector("#password2")).getAttribute("placeholder");
Assertions.assertEquals(placeholder2, "再次输入密码");
WebElement element = driver.findElement(By.cssSelector("#body > div > h3"));
Assertions.assertNotNull(element);
}
//测试注册功能 成功注册和输入两次密码不正确的用户
@ParameterizedTest
@CsvSource(value = {"qqq,123,123", "aaa,123,1234"})
@Order(2)
void registGN(String username, String password, String newPassword) throws InterruptedException {
if (driver.findElement(By.cssSelector("#body > div > h3")).getText().equals("登录")){
driver.findElement(By.cssSelector("#body > div > div:nth-child(5) > a")).click();
}
driver.findElement(By.cssSelector("#user")).sendKeys(username);
driver.findElement(By.cssSelector("#password1")).sendKeys(password);
driver.findElement(By.cssSelector("#password2")).sendKeys(newPassword);
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(3000);
Alert alert = driver.switchTo().alert();
alert.accept();
}
@Test
@Order(3)
void quite() {
driver.quit();
}
}
音乐列表页测试
package com.example.onlinemusic.Mymusic;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import java.time.Duration;
import java.util.Set;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class MusicListTest {
private static ChromeDriver driver;
private static ChromeDriver getDriver() {
if (driver == null) {
driver = new ChromeDriver();
//隐式等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
}
return driver;
}
@Test
@BeforeAll
static void start() throws InterruptedException {
driver = getDriver();
driver.get("http://49.232.4.81:8080/login.html");
String windowHandle = driver.getWindowHandle();
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
Set<String> windowHandles = driver.getWindowHandles();
for(String window : windowHandles){
if(window != windowHandle){
driver.switchTo().window(window);
break;
}
}
}
@Test
@Order(1)
void ListUI() throws InterruptedException {
String text = driver.findElement(By.xpath("/html/body/div[1]/h3")).getText();
Assertions.assertNotNull(text);
String text1 = driver.findElement(By.cssSelector("#body > div.container > div:nth-child(2) > form > div > label")).getText();
Assertions.assertEquals(text1, "歌曲名");
String text2 = driver.findElement(By.cssSelector("#submit1")).getText();
Assertions.assertEquals(text2, "查询");
String text3 = driver.findElement(By.cssSelector("#body > div.container > div.nav > a:nth-child(1)")).getText();
Assertions.assertEquals(text3, "喜欢列表");
String text4 = driver.findElement(By.cssSelector("#body > div.container > div.nav > a:nth-child(2)")).getText();
Assertions.assertEquals(text4, "添加歌曲");
String text5 = driver.findElement(By.cssSelector("#delete")).getText();
Assertions.assertEquals(text5, "删除选中");
}
//模糊查询 和 全值匹配
@ParameterizedTest
@ValueSource(strings = {"C", "Crush", "h"})
@Order(2)
void search(String name) throws InterruptedException {
driver.findElement(By.cssSelector("#exampleInputName2")).clear();
driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys(name);
driver.findElement(By.cssSelector("#submit1")).click();
String text = driver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(2)")).getText();
Assertions.assertEquals(text, "Crush");
Thread.sleep(1000);
//检测一下搜索后的 UI
String text1 = driver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(5) > button:nth-child(2)")).getText();
Assertions.assertEquals(text1, "喜欢");
String text2 = driver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(5) > button:nth-child(1)")).getText();
Assertions.assertEquals(text2, "删除");
String text3 = driver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(4) > button")).getText();
Assertions.assertEquals(text3, "播放歌曲");
}
@Test
@Order(3)
void deleteMusic() throws InterruptedException {
driver.navigate().refresh();
Thread.sleep(1000);
driver.findElement(By.cssSelector("#info > tr:nth-child(5) > td:nth-child(5) > button:nth-child(1)")).click();
Thread.sleep(3000);
Alert alert = driver.switchTo().alert();
alert.accept();
Thread.sleep(3000);
System.out.println("删除成功");
}
@Test
@Order(4)
void loveMusic() throws InterruptedException {
//喜欢音乐
driver.findElement(By.cssSelector("#info > tr > td:nth-child(5) > button:nth-child(2)")).click();
Thread.sleep(3000);
Alert alert = driver.switchTo().alert();
alert.accept();
Thread.sleep(2000);
driver.findElement(By.cssSelector("#body > div.container > div.nav > a:nth-child(1)")).click();
driver.findElement(By.cssSelector("#info > tr > td:nth-child(3) > button")).click();
Thread.sleep(3000);
String text = driver.findElement(By.cssSelector("#info > tr > td:nth-child(1)")).getText();
Assertions.assertEquals(text, "Crush");
driver.findElement(By.cssSelector("body > div.container > div:nth-child(3) > a")).click();
}
@Test
@Order(5)
void quit() {
driver.quit();
}
}
文件上传测试
package com.example.onlinemusic.Mymusic;
import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.time.Duration;
import java.util.Set;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class FileUploadTest {
private static ChromeDriver driver;
private static ChromeDriver getDriver() {
if (driver == null) {
driver = new ChromeDriver();
//隐式等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
}
return driver;
}
@Test
@BeforeAll
static void start() throws InterruptedException {
driver = getDriver();
driver.get("http://49.232.4.81:8080/login.html");
Thread.sleep(2000);
String windowHandle = driver.getWindowHandle();
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
Alert alert = driver.switchTo().alert();
alert.accept();
Set<String> windowHandles = driver.getWindowHandles();
for(String window : windowHandles){
if(window != windowHandle){
driver.switchTo().window(window);
break;
}
}
}
@Test
@Order(1)
void uploadUI() throws InterruptedException {
driver.findElement(By.cssSelector("#body > div.container > div.nav > a:nth-child(2)")).click();
Thread.sleep(3000);
String text2 = driver.findElement(By.cssSelector("body > form > input[type=submit]:nth-child(3)")).getAttribute("value");
Assertions.assertEquals(text2, "上传");
}
//成功上传
@Test
@Order(2)
void uploadFile1() throws InterruptedException {
WebElement element = driver.findElement(By.cssSelector("body > form > input[type=file]:nth-child(1)"));
element.sendKeys("D:\\下载\\小半.mp3");
Thread.sleep(3000);
driver.findElement(By.cssSelector("body > form > label > input[type=text]")).sendKeys("陈粒");
driver.findElement(By.cssSelector("body > form > input[type=submit]:nth-child(3)")).click();
Thread.sleep(2000);
}
//同歌名不同歌手
@Test
@Order(3)
void uploadFile2() throws InterruptedException {
driver.findElement(By.cssSelector("#body > div.container > div.nav > a:nth-child(2)")).click();
Thread.sleep(3000);
WebElement element = driver.findElement(By.cssSelector("body > form > input[type=file]:nth-child(1)"));
element.sendKeys("D:\\下载\\小半.mp3");
Thread.sleep(3000);
driver.findElement(By.cssSelector("body > form > label > input[type=text]")).sendKeys("陈粒粒");
driver.findElement(By.cssSelector("body > form > input[type=submit]:nth-child(3)")).click();
Thread.sleep(2000);
try{
String text = driver.findElement(By.cssSelector("#submit1")).getText();
Assertions.assertEquals(text, "查询");
}catch (Exception e){
System.out.println("已用同名歌曲,上传失败");
}
}
//不传文件 报错
@Test
@Order(4)
void uploadFile3() throws InterruptedException {
driver.findElement(By.cssSelector("#body > div.container > div.nav > a:nth-child(2)")).click();
Thread.sleep(3000);
WebElement element = driver.findElement(By.cssSelector("body > form > input[type=file]:nth-child(1)"));
Thread.sleep(3000);
driver.findElement(By.cssSelector("body > form > label > input[type=text]")).sendKeys("陈粒粒");
driver.findElement(By.cssSelector("body > form > input[type=submit]:nth-child(3)")).click();
Thread.sleep(2000);
try{
String text = driver.findElement(By.cssSelector("#submit1")).getText();
Assertions.assertEquals(text, "查询");
}catch (Exception e){
System.out.println("没有选择文件,上传失败!");
driver.navigate().back();
driver.navigate().back();
}
}
//上传的不是mp3文件
@Test
@Order(5)
void uploadFile4() throws InterruptedException {
driver.findElement(By.cssSelector("#body > div.container > div.nav > a:nth-child(2)")).click();
Thread.sleep(3000);
WebElement element = driver.findElement(By.cssSelector("body > form > input[type=file]:nth-child(1)"));
element.sendKeys("D:\\下载\\《乔治湖,自由习作》.jpg");
Thread.sleep(3000);
driver.findElement(By.cssSelector("body > form > label > input[type=text]")).sendKeys("陈粒粒");
driver.findElement(By.cssSelector("body > form > input[type=submit]:nth-child(3)")).click();
Thread.sleep(2000);
try{
String text = driver.findElement(By.cssSelector("#submit1")).getText();
Assertions.assertEquals(text, "查询");
}catch (Exception e){
System.out.println("不是MP3文件,上传失败!");
driver.navigate().back();
driver.navigate().back();
}
}
//上传修改后缀名得到的 MP3 文件 格式错误
@Test
@Order(6)
void uploadFile5() throws InterruptedException {
driver.findElement(By.cssSelector("#body > div.container > div.nav > a:nth-child(2)")).click();
Thread.sleep(3000);
WebElement element = driver.findElement(By.cssSelector("body > form > input[type=file]:nth-child(1)"));
element.sendKeys("D:\\下载\\修改后缀名.mp3");
Thread.sleep(3000);
driver.findElement(By.cssSelector("body > form > label > input[type=text]")).sendKeys("陈粒粒");
driver.findElement(By.cssSelector("body > form > input[type=submit]:nth-child(3)")).click();
Thread.sleep(2000);
try{
String text = driver.findElement(By.cssSelector("#submit1")).getText();
Assertions.assertEquals(text, "查询");
}catch (Exception e){
System.out.println("不是mp3文件,上传失败!");
driver.navigate().back();
driver.navigate().back();
}
driver.quit();
}
}
通过 Suite 套件测试
package com.example.onlinemusic.Mymusic;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
@Suite
@SelectClasses({LoginTest.class,RegistTest.class,MusicListTest.class,FileUploadTest.class})
public class RunSuit {
}
测试结果
全部通过测试: