【测试开发】web 自动化测试实战 --- MuiscServerTest

news2024/9/24 6:30:48

目录

  • 界面测试
  • 功能测试
    • 1. 登录注册模块功能测试
    • 2. 音乐列表页自动化测试
    • 3. 喜欢音乐列表页自动化测试
    • 4. 上传音乐模块自动化测试
    • 5. 以上所有测试用例集成测试套件
    • 项目测试亮点

web 自动化测试实战就通过测试自己的 onlinemusicserver 音乐服务器项目进行测试,通过 selenium4 自动化测试套件+Junit5 单元测试框架,来对项目中的功能进行自动化测试
在这里插入图片描述
项目的功能有:登录,注册,查询音乐,收藏音乐,上传音乐,删除选中音乐,注销用户,播放音乐
首先明确设计测试用例万能公式:
在这里插入图片描述

界面测试

接下来首先进行项目的界面测试和功能测试:
项目界面测试用例:
在这里插入图片描述
主要通过自动化测试针对项目页面进行“拍照”来进行界面测试;

功能测试

功能测试测试case设计如下:
在这里插入图片描述
在这里插入图片描述

1. 登录注册模块功能测试

针对使用脑图设计的测试用例来执行自动化测试:
● 使用selenium+Junit5 来进行项目的自动化测试
登录页面自动化测试:
(更多标注在代码中以注释形式给出)

@TestMethodOrder(MethodOrderer.class)
public class LoginPageTest {
    ChromeDriver chromeDriver= CommonDriver.getChromeDriver();
    @BeforeEach
    void getUrl(){
        chromeDriver.get("http://124.220.134.3:8082/login.html");
        chromeDriver.findElement(By.cssSelector("#user")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
    }
    //@Test
    void test(){
        chromeDriver.findElement(By.cssSelector("#user")).sendKeys("admin");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("admin");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
    }
    @Test
    @Order(1)
    void getLoginPage() throws InterruptedException, IOException {
        // 界面测试,拍照
        Thread.sleep(2000);
        ScreenShotUtil.getScreenShot(LoginPageTest.class.getName());
        String value = chromeDriver.findElement(By.cssSelector("#submit")).getAttribute("value");
        Assertions.assertEquals(value,"登录");
    }
    @Test
    @Order(2)
    void loginSuccess(){
        chromeDriver.findElement(By.cssSelector("#user")).sendKeys("admin");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("admin");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        Alert alert=chromeDriver.switchTo().alert();
        String text = alert.getText();
        System.out.println(text);
        Assertions.assertEquals(text,"登录成功!");
        alert.accept();
    }
    @Test
    @Order(3)
    void onlyUserNameTest(){
        // 只输入用户名
        chromeDriver.findElement(By.cssSelector("#user")).sendKeys("admin");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        Alert alert=chromeDriver.switchTo().alert();
        String text = alert.getText();
        System.out.println(text);
        Assertions.assertEquals(text,"用户名或密码不能为空!");
        alert.accept();
    }

    @Test
    @Order(4)
    void onlyPwdTest(){
      //   只输入密码
        chromeDriver.findElement(By.cssSelector("#user")).sendKeys("");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("123");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        Alert alert=chromeDriver.switchTo().alert();
        String text = alert.getText();
        System.out.println(text);
        Assertions.assertEquals(text,"用户名或密码不能为空!");
        alert.accept();
    }

    @Test
    @Order(5)
    void nullNameAndPwd(){
        // 用户名和密码均不输入
        chromeDriver.findElement(By.cssSelector("#user")).sendKeys("");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        Alert alert=chromeDriver.switchTo().alert();
        String text = alert.getText();
        System.out.println(text);
        Assertions.assertEquals(text,"用户名或密码不能为空!");
        alert.accept();
    }

    @Test
    @Order(6)
    void errotNameAndPwd(){
        // 输入错误的用户名和密码
        chromeDriver.findElement(By.cssSelector("#user")).sendKeys("asdds");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("123");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        Alert alert=chromeDriver.switchTo().alert();
        String text = alert.getText();
        System.out.println(text);
        Assertions.assertEquals(text,"登录失败,用户名或密码错误");
        alert.accept();
    }

    // 点击注册按钮是否可以正常跳转到注册页面
    @Test
    @Order(7)
    void getRegPageTest(){
        chromeDriver.findElement(By.cssSelector("#body > div > div.reg > a")).click();
        String value = chromeDriver.findElement(By.cssSelector("#submit")).getAttribute("value");
        Assertions.assertEquals(value,"注册用户");
    }

    //窗口测试
    @Test
    @Order(8)
    void windowTest() throws IOException, InterruptedException {
        chromeDriver.manage().window().minimize();
        getLoginPage();
        chromeDriver.manage().window().maximize();
        getLoginPage();
        Thread.sleep(1000);
    }
    @AfterAll
    static void quitDriver(){
        QuitDriver.quitDriver();
    }


}

注册页面自动化测试:

@TestMethodOrder(MethodOrderer.class)
public class RegPageTest {
     ChromeDriver chromeDriver= CommonDriver.getChromeDriver();
    @BeforeEach
    void getUrl(){

        chromeDriver.get("http://124.220.134.3:8082/register.html");
        chromeDriver.findElement(By.cssSelector("#username")).clear();
        chromeDriver.findElement(By.cssSelector("#password")).clear();
    }
    @Test
    @Order(1)
    void backLoginPage(){
        // 点击回到登录页面是否可以正确回到登录页面
        chromeDriver.findElement(By.cssSelector("body > div.nav > a")).click();
        String text = chromeDriver.findElement(By.cssSelector("#body > div > h3")).getText();
        Assertions.assertEquals(text,"管理员登录");
    }
    @Test
    @Order(2)
        // 输入不违规且正确的用户名和面,注册成功
    void regSuccess() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("qwsa"+ RandomUtil.getRandomNum());
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("123321");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals(alert.getText(),"注册成功!");
        alert.accept();
    }
    @Test
            @Order(3)
    // 输入已存在的用户名,提示用户已存在
    void regExitName() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("admin");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("123321");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals(alert.getText(),"注册失败,可能是当前用户名已存在");
        alert.accept();

    }

    @Test
            @Order(4)
        // 输入已存在的密码,依旧注册成功
    void regExitPwd() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("tgvsada1"+RandomUtil.getRandomNum());
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("123321");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals(alert.getText(),"注册成功!");
        alert.accept();

    }
    // 输入违规的用户名或者密码(此处输入超出长度限制的用户名)
    @Test
    @Order(5)
    void regTooLongName() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("adsssssssssssssadassaddsatgfhbv");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("123321");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals(alert.getText(),"注册失败,可能是当前用户名已存在");
        alert.accept();

    }
    @Test
    @Order(6)
    void regName() throws InterruptedException {
        // 只输入用户名
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("fhbv");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals(alert.getText(),"用户名或密码不能为空!");
        alert.accept();

    }
    @Test
    @Order(7)
    void regOnlyPwd() throws InterruptedException {
        // 只输入密码
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys("");
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys("asdsa");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals(alert.getText(),"用户名或密码不能为空!");
        alert.accept();
    }
    @Test
    @Order(8)
    void pageTest() throws InterruptedException, IOException {
        // 界面测试
        // 界面测试,拍照
        Thread.sleep(2000);
        ScreenShotUtil.getScreenShot(LoginPageTest.class.getName());
        String value = chromeDriver.findElement(By.cssSelector("body > div.nav > span")).getText();
        Assertions.assertEquals(value,"音乐服务器注册页面");
//        chromeDriver.navigate().forward(); // 前进后退
//        chromeDriver.navigate().back(); // 前进后退
    }
    @ParameterizedTest
    @CsvSource(value = {"qqq1-123","www1-123","eee1-123","rrr1-123"},delimiterString = "-")
    @Order(9)
    // 动态参数注册测试
    void regParameterized(String username,String password) throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        chromeDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals(alert.getText(),"注册成功!");
        alert.accept();
    }
    //窗口测试
    @Test
    @Order(9)
    void windowTest() throws IOException, InterruptedException {
        chromeDriver.manage().window().minimize();
        pageTest();
        chromeDriver.manage().window().maximize();
        pageTest();
        Thread.sleep(1000);
    }

    @AfterAll
    static void quitDriver(){
        QuitDriver.quitDriver();
    }


}

2. 音乐列表页自动化测试

package com.webautotest.tests;

@TestMethodOrder(MethodOrderer.class)
public class ListPageTest  {
    private static final ChromeDriver chromeDriver= CommonDriver.getChromeDriver();

    @BeforeAll
     static void getUrlAndLogin(){
        // 先进行用户登录记录cookie然后进行列表页测试
        chromeDriver.get("http://124.220.134.3:8082/login.html");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        Alert alert=chromeDriver.switchTo().alert();
        String text = alert.getText();
        alert.accept();
    }

    /**
     * 校验首页是否正确展示功能
     */
    @Test
    @Order(1)
    void checkListEle() throws IOException {
        chromeDriver.get("http://124.220.134.3:8082/list.html");
        String chaxunText=chromeDriver.findElement(By.cssSelector("#submit1")).getText();
        String titleText=chromeDriver.findElement(By.cssSelector("#body > div.container > h3")).getText();
        // 检验文本是否符合预期
        Assertions.assertEquals("查询",chaxunText);
        Assertions.assertEquals("在线音乐服务器实现",titleText);
        // 拍照留存 界面测试
        ScreenShotUtil.getScreenShot(ListPageTest.class.getName());
    }


    @Test
    @Order(2)
     //点击页面按钮功能是否是正确的
    void checkButtonRight() throws InterruptedException, IOException {
        // 点击喜欢音乐能否正确跳转到添加喜欢音乐页面列表
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(1)")).click();
        String retuenList=chromeDriver.findElement(By.cssSelector("body > div.container > div:nth-child(3) > a")).getText();
        Assertions.assertEquals(retuenList,"回到首页");
        chromeDriver.navigate().back();
        // 点击上传音乐按钮能否正常跳转到上传音乐按钮
        chromeDriver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(2)")).click();
        Assertions.assertEquals("上传音乐文件",chromeDriver.findElement(By.cssSelector("body > div > form > div > h3")).getText());
        Assertions.assertEquals("回退音乐列表>>",chromeDriver.findElement(By.cssSelector("body > a")).getText());
        chromeDriver.navigate().back();

    }
    //窗口测试
    @Test
//    @Order(3)
    void windowTest() throws IOException, InterruptedException {
        chromeDriver.manage().window().minimize();
        checkListEle();
        chromeDriver.manage().window().maximize();
        checkListEle();
        Thread.sleep(1000);
    }
    // 查询音乐测试
    // 模糊查询/全名查询
    // 等价类思想
    @ParameterizedTest
    @CsvSource(value = {"灰,芳","灰姑娘,芳华"})
    void searchMusicTest(String name1,String name2) throws InterruptedException {
        System.out.println(name1);
        chromeDriver.findElement(By.cssSelector("#exampleInputName2")).clear();
        chromeDriver.findElement(By.cssSelector("#exampleInputName2")).sendKeys(name1);
        chromeDriver.findElement(By.cssSelector("#submit1")).click();
        Thread.sleep(1000);
        Assertions.assertEquals(chromeDriver.findElement(By.cssSelector("#info > tr > td:nth-child(2)")).getText(),"梁咏琪 - 灰姑娘");

        System.out.println(name2);
        chromeDriver.findElement(By.cssSelector("#exampleInputName2")).clear();
        chromeDriver.findElement(By.cssSelector("#exampleInputName2")).sendKeys(name2);
        chromeDriver.findElement(By.cssSelector("#submit1")).click();
        Thread.sleep(1000);
        Assertions.assertEquals(chromeDriver.findElement(By.cssSelector("#info > tr > td:nth-child(2)")).getText(),"吴漾 - 芳华");
    }
    // 点击播放音乐,音乐能否正常播放
    @Test
    void playerMusic() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#info > tr:nth-child(3) > td:nth-child(4) > button")).click();
        Thread.sleep(10000);
        // 此处能否播放音乐主要通过人来判断是否有音乐声
        Assertions.assertEquals(chromeDriver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(4) > button")).getText(),"播放歌曲");
    }
    @Test
    void deleteMusicTest() throws InterruptedException {
        // 删除音乐测试
        chromeDriver.findElement(By.cssSelector("#info > tr:nth-child(3) > td:nth-child(5) > button:nth-child(1)")).click();
        Thread.sleep(1000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals("删除成功!",alert.getText());
        alert.accept();
    }
    // 批量删除音乐测试
    @Test
    void deleteManyMusicTest() throws InterruptedException {
       chromeDriver.findElement(By.cssSelector("#\\31 6")).click();
       chromeDriver.findElement(By.cssSelector("#\\31 7")).click();
        Thread.sleep(2000);
        chromeDriver.findElement(By.cssSelector("#delete")).click();
        Thread.sleep(1000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals("选中音乐删除成功!",alert.getText());
        alert.accept();
    }
    //
    // 喜欢(收藏)音乐测试
    @Test
    void loveMusicTest() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#info > tr:nth-child(2) > td:nth-child(5) > button:nth-child(2)")).click();
        Thread.sleep(1000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals("收藏音乐成功!",alert.getText());
        alert.accept();
        Thread.sleep(1000);
    }
    // 注销当前用户操作测试
    @Test
    void logoutTest() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#logout")).click();
        Thread.sleep(1000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals("注销成功~",alert.getText());
        alert.accept();
        Thread.sleep(1000);
    }

    @AfterAll
    static void quitDriver(){
        chromeDriver.quit();
    }
}

3. 喜欢音乐列表页自动化测试

package com.webautotest.tests;

// 喜欢音乐列表测试
public class LoveMusicPageTest {
    private static final ChromeDriver chromeDriver= CommonDriver.getChromeDriver();
    @BeforeAll
    static void getUrlAndLogin(){
        // 先进行用户登录记录cookie然后进行列表页测试
        chromeDriver.get("http://124.220.134.3:8082/login.html");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        Alert alert=chromeDriver.switchTo().alert();
        alert.accept();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        chromeDriver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(1)")).click();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
//        chromeDriver.get("http://124.220.134.3:8082/loveMusic.html");
//        Set<String> windowHandles = chromeDriver.getWindowHandles();
//        for (String window:windowHandles) {
//            if (window!=chromeDriver.getWindowHandle()){
//                chromeDriver.switchTo().window(window);
//                break;
//            }
//        }
    }

    // 界面测试
    @Test
    void lovePageTest() throws IOException, InterruptedException {
        Thread.sleep(1000);
        ScreenShotUtil.getScreenShot(LoveMusicPageTest.class.getName());
        String title=chromeDriver.findElement(By.cssSelector("body > div.container > h3")).getText();
        Assertions.assertEquals(title,"我喜欢的音乐列表");
    }
    // 查询音乐测试
    // 模糊查询/全名查询
    // 等价类思想
    @ParameterizedTest
    @ValueSource(strings = {"灰","灰姑娘"})
    void searchMusicTest(String name) throws InterruptedException {
        System.out.println(name);
        chromeDriver.findElement(By.cssSelector("#exampleInputName2")).clear();
        chromeDriver.findElement(By.cssSelector("#exampleInputName2")).sendKeys(name);
        chromeDriver.findElement(By.cssSelector("#submit1")).click();
        Thread.sleep(1000);
        Assertions.assertEquals(chromeDriver.findElement(By.cssSelector("#info > tr > td:nth-child(1)")).getText(),"梁咏琪 - 灰姑娘");
    }
    // 点击播放音乐,音乐能否正常播放
    @Test
    void playerMusic() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(3) > button")).click();
        Thread.sleep(10000);
        // 此处能否播放音乐主要通过人来判断是否有音乐声
        Assertions.assertEquals(chromeDriver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(3) > button")).getText(),"播放歌曲");
    }
    // 测试回到首页按钮能否正确执行
    @Test
    void backListPageTest() throws InterruptedException {
        //chromeDriver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(10));
        chromeDriver.findElement(By.cssSelector("body > div.container > div:nth-child(3) > a")).click();
        Thread.sleep(1000);
        Assertions.assertEquals(chromeDriver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(1)")).getText(),"喜欢列表");
    }
    // 测试音乐移除喜欢音乐列表操作能否正确执行
    @Test
    void deleteLoveTest() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#info > tr:nth-child(2) > td:nth-child(4) > button")).click();
        Thread.sleep(1000);
        Alert alert=chromeDriver.switchTo().alert();
        Assertions.assertEquals("删除成功!",alert.getText());
    }

    @Test
//    @Order(3)
    void windowTest() throws IOException, InterruptedException {
        chromeDriver.manage().window().minimize();
        lovePageTest();
        chromeDriver.manage().window().maximize();
        lovePageTest();
        Thread.sleep(1000);
    }
    @AfterAll
    static void quit(){
        QuitDriver.quitDriver();
    }

}

4. 上传音乐模块自动化测试

package com.webautotest.tests;

public class UploadListTest {
    private static final ChromeDriver chromeDriver= CommonDriver.getChromeDriver();
    // 上传音乐页面测试
    @BeforeAll
    static void getUrlAndLogin(){
        // 先进行用户登录记录cookie然后进行列表页测试
        chromeDriver.get("http://124.220.134.3:8082/login.html");
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        Alert alert=chromeDriver.switchTo().alert();
        alert.accept();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
        chromeDriver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(2)")).click();
        try {
            Thread.sleep(1000);
        }catch (Exception e){
            e.printStackTrace();
        }
//        chromeDriver.get("http://124.220.134.3:8082/loveMusic.html");
//        Set<String> windowHandles = chromeDriver.getWindowHandles();
//        for (String window:windowHandles) {
//            if (window!=chromeDriver.getWindowHandle()){
//                chromeDriver.switchTo().window(window);
//                break;
//            }
//        }
    }
    // 界面测试
    @Test
    void uploadPageTest() throws InterruptedException, IOException {
        Thread.sleep(2000);
        ScreenShotUtil.getScreenShot(UploadListTest.class.getName());
        Assertions.assertEquals("上传音乐文件",chromeDriver.findElement(By.cssSelector("body > div > form > div > h3")).getText());
    }
    // 点击回退音乐列表按钮是否能正常回退
    @Test
    void backListTest(){
        chromeDriver.findElement(By.cssSelector("body > a")).click();
        Assertions.assertEquals("在线音乐服务器实现",chromeDriver.findElement(By.cssSelector("#body > div.container > h3")).getText());
    }

    // 正常上传mp3音乐文件功能测试
    @Test
    void uploadTrueMusicTest() throws InterruptedException {
        WebElement element = chromeDriver.findElement(By.cssSelector("#select"));
        element.sendKeys("C:\\Users\\yangxinshang\\Desktop\\mp3 music\\吴漾 - 芳华.mp3");
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("#singer")).sendKeys("吴漾");
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
        Assertions.assertEquals("喜欢列表",chromeDriver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(1)")).getText());
    }


    // 正常上传mp3音乐文件功能测试,但是不填写歌手信息
    @Test
    void uploadTrueMusicTestNoSinger() throws InterruptedException {
        WebElement element = chromeDriver.findElement(By.cssSelector("#select"));
        element.sendKeys("C:\\Users\\yangxinshang\\Desktop\\mp3 music\\吴漾 - 芳华.mp3");
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("#singer")).sendKeys("");
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
        Assertions.assertEquals("喜欢列表",chromeDriver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(1)")).getText());
    }

    // 无填写音乐路径直接点击上传按钮
    @Test
    void uploadOnlySub() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
        System.out.println(chromeDriver.findElement(By.cssSelector("body > pre")).getText());
        Assertions.assertEquals("{\"data\":null,\"message\":\"代码出现异常,异常信息为:String index out of range: -1\",\"status\":-1}",chromeDriver.findElement(By.cssSelector("body > pre")).getText());
    }
    // 上传音乐没有选中音乐,只有歌手名称,是否可以正常上传
    @Test
    void uploadOnlySinger() throws InterruptedException {
        chromeDriver.findElement(By.cssSelector("#singer")).sendKeys("singer");
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
       // System.out.println(chromeDriver.findElement(By.cssSelector("body > pre")).getText());
        Assertions.assertEquals("{\"data\":null,\"message\":\"代码出现异常,异常信息为:String index out of range: -1\",\"status\":-1}",chromeDriver.findElement(By.cssSelector("body > pre")).getText());
    }

    // 同歌曲名不同歌手 是否可以正常上传
    @Test
    void uploadTongSingTest() throws InterruptedException {
        WebElement element = chromeDriver.findElement(By.cssSelector("#select"));
        element.sendKeys("C:\\Users\\yangxinshang\\Desktop\\mp3 music\\吴漾 - 芳华.mp3");
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("#singer")).sendKeys("吴漾2");
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
        Assertions.assertEquals("喜欢列表",chromeDriver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(1)")).getText());
    }
    // 上传的文件不是.mp3格式是否可以正常上传
    @Test
    void uploadNoMp3() throws InterruptedException {
        WebElement element = chromeDriver.findElement(By.cssSelector("#select"));
        element.sendKeys("C:\\Users\\yangxinshang\\Desktop\\mp3 music\\副本.jpg");
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("#singer")).sendKeys("吴漾");
        Thread.sleep(1000);
        chromeDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
        Assertions.assertEquals("喜欢列表", chromeDriver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(1)")).getText());
    }
    @Test
    void windowTest() throws IOException, InterruptedException {
        chromeDriver.manage().window().minimize();
        uploadPageTest();
        chromeDriver.manage().window().maximize();
        uploadPageTest();
        Thread.sleep(1000);
    }
    @AfterAll
    static void quit(){
        QuitDriver.quitDriver();
    }
}

5. 以上所有测试用例集成测试套件

@Suite
@SelectClasses(value = { UploadListTest.class,LoginPageTest.class,RegPageTest.class,ListPageTest.class, LoveMusicPageTest.class})
public class RunSuite {
}

如果选择 @SelectClasses 来指定运行的类时,那么类的执行顺序是按照我们在 @SelectClasses 中手动指定的类的顺序来执行的
开始执行:
在这里插入图片描述
在这里插入图片描述
所设计测试用例均执行通过,共耗时 3min26sec

– 未完 (性能测试+兼容性测试+易用性测试+安全测试)

项目测试亮点

此自动化测试的亮点:
● 使用Junit5中的新注解:@BeforeEach/All @AfterEach/All … 注解避免生成过多对象,避免造成了资源和时间的浪费
● 操作页面的核心 chromeDriver 驱动对象创建利用了单例模式的设计思想,实现方式是 DLC 双检锁的懒汉式创建方式
● 通过static修饰静态变量,全局只创建了一次对象,避免重复创建驱动对象造成时间的浪费
● 使用 参数化(动态参数):保持用例的简洁,提高了代码的可读性
● 使用测试套件 suite:一次性执行所有不同类中的自动化测试用例
● 使用等待:隐式等待+强制等待,(不用显示等待是因为 一般隐式和显示不一起使用,其次就是显示等待写起来太麻烦,而且对于警告框只有强制等待适用),提高了自动化测试的稳定性,降低自动化测试出现误报的概率
● 使用屏幕截图:方便问题的追溯和问题的解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

冰冰学习笔记:多线程

欢迎各位大佬光临本文章&#xff01;&#xff01;&#xff01; 还请各位大佬提出宝贵的意见&#xff0c;如发现文章错误请联系冰冰&#xff0c;冰冰一定会虚心接受&#xff0c;及时改正。 本系列文章为冰冰学习编程的学习笔记&#xff0c;如果对您也有帮助&#xff0c;还请各位…

基于TimeQuest时序优化原理和方法

&#x1f4a1; 回顾基于RTL逻辑时序优化的基本思路&#xff0c;在关键路径中插入寄存器来优化时序 分析最坏路径 通过前面对TimeQuest软件的理解&#xff0c;基本上可以找到关键路径&#xff0c;此文章主要对关键路径时序进行优化&#xff0c;使设计达到时序要求&#xff0c;以…

RibbitMQ 入门到应用 ( 一 ) 基本概念

1.什么是RabbitMQ 1.0.什么是MQ 1.1.RabbitMQ简介 消息队列提供一个异步通信机制&#xff0c;消息的发送者不必一直等待到消息被成功处理才返回&#xff0c;而是立即返回。消息中间件负责处理网络通信&#xff0c;如果网络连接不可用&#xff0c;消息被暂存于队列当中&#…

基于YOLOV5的钢材缺陷检测

数据和源码见文末 1.任务概述 数据集使用的是东北大学收集的一个钢材缺陷检测数据集,需要检测出钢材表面的6种划痕。同时,数据集格式是VOC格式,需要进行转化,上传的源码中的数据集是经过转换格式的版本。 2.数据与标签配置方法 在数据集目录下,train文件夹下有训练集数据…

机器学习基本概念总结

深度学习是机器学习的一个特定分支&#xff0c;要想充分理解深度学习&#xff0c;就必须对机器学习的基本原理有深刻的理解。机器学习的本质属于应用统计学&#xff0c;其更多地关注如何用计算机统计地估计复杂函数&#xff0c;而不太关注为这些函数提供置信区间&#xff0c;大…

HTTP、HTTPS

目录 1.HTTP 1.1.概述 1.2.报文结构 1.2.1.请求报文 1.2.2.响应报文 1.3.方法 2.HTTPS 1.HTTP 1.1.概述 HTTP&#xff0c;超文本传输协议&#xff0c;WEB体系选用了该协议作为应用层协议。 1.2.报文结构 1.2.1.请求报文 HTTP的请求报文&#xff08;request&#xff0…

idea集成chatGPT

idea集成chatGPT 一、idea安装chat GPT插件 1.在Plugins中搜索chatGPT&#xff0c;找到如图所示的这个并点击安装&#xff0c;安装完成后点击apply 插件安装成后会出现chatGPT的图标 2.点击点击工具窗口的扳手按钮&#xff0c;将进行插件的初始设置&#xff0c;这里选择官方…

Linux GPIO模块-RK3588 GPIO驱动分析

1.简介 GPIO是可编程的通用I/O外设。如下图所示&#xff0c;RK3588 GPIO控制器包含3个部分&#xff1b;APB接口模块和SoC内部的APB总线连接&#xff0c;负责与SoC交换数据&#xff0c;位宽为32位&#xff1b;I/O port接口模块管理外部的引脚&#xff0c;引脚的输入和输出都要经…

C++复习笔记7

1.C内存分区 C内存分区&#xff1a;代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统管理 全局区&#xff1a;存放全局变量静态变量和常量。 栈区&#xff1a;编译器分配&#xff0c;存放函数的参数值和局部变量等。 堆区&#xff1a;由程序员分配和释放&a…

IntelliJ IDEA 创建JavaFX项目运行

IntelliJ IDEA 创建JavaFX项目运行JavaFX官网文档&#xff1a;https://openjfx.io/openjfx-docs/ JavaFX 2008年12月05日诞生&#xff0c;是一个开源的下一代客户端应用程序平台&#xff0c;适用于基于 Java 构建的桌面、移动和嵌入式系统。这是许多个人和公司的协作努力&#…

函数栈帧的创建和销毁(C语言)

函数栈帧的创建和销毁&#xff08;C语言&#xff09;前言主体前言 函数栈帧是一个非常重要的概念&#xff0c;是重点也是难点&#xff0c;当然涉及底层方面的知识都会很难&#xff0c;但是对我们理解函数的创建和运用有非常重要的作用。本篇博客的目的就是了解函数栈帧的创建和…

go 命令行工具整理

这里会整理可能会使用到的命令行参数&#xff0c;比如 go build、go run&#xff0c;诸如此类。了解这些内容对我们工作会有什么帮助吗&#xff1f;更多的时候&#xff0c;是能让我们理解代码编译的意图&#xff0c;或者&#xff0c;给我们一种排查问题的手段。 比方说&#x…

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(一级)答案解析

目录 一、单选题(共25题&#xff0c;共50分) 二、判断题(共10题&#xff0c;共20分) 三、编程题(共2题&#xff0c;共30分) 青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;一级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 小明想在开始…

【博学谷学习记录】超强总结,用心分享 | 架构师 Spring源码学习总结

文章目录Spring的循环依赖1.循环依赖的定义&&原因2.循环依赖的场景1.构造器注入引起循环依赖2.Field属性setter注入的循环依赖3.循环依赖解决思路4.三级缓存5.面试题[三级缓存]AOP源码深度剖析概述Spring AOP的前世今生实现机制**JDK 动态代理****CGLIB 代理**流程总结…

六十分之十三——黎明前

目录一、目标二、计划三、完成情况四、提升改进(最少3点)五、意外之喜(最少2点)六、总结一、目标 明确可落地&#xff0c;对于自身执行完成需要一定的努力才可以完成的 1.8本技术管理书籍阅读(使用番茄、快速阅读、最后输出思维导图)2.吴军系列硅谷来信1听书、香帅的北大金融…

成都哪家机构的Java培训比较好,求一个不坑的?

关于这个问题&#xff0c;相信你会得到很多条答案&#xff0c;以及很多家机构的自荐。既然如此&#xff0c;不如也了解一下老牌IT职业教育机构&#xff1a;有足够丰富的教学经验&#xff0c;丰富的教学产品资源以及成熟的就业保障体系&#xff0c;还有就是承担风险的能力。 很…

计算机网络7:传输层相关

目录1-传输层1.1 UDP 和 TCP 的特点1.1.1 UDP用户数据报格式1.1.2 TCP首部格式1.1.2.1 常用端口号1.2 TCP的三次握手1.2.1 三次握手的原因1.3 TCP四次挥手1.3.1 四次挥手的原因1.3.2 TIME_WAIT为什么是2MSL1.4 TCP的可靠传输有效机制1.4.1 TCP可靠传输-超时重传1.4.2 TCP流量控…

封装、继承、Super、重写、多态instanceof类型转换的使用以及个人见解

这里写目录标题封装继承supersuper和this的区别重写多态instanceof类型转换封装 之前我们调用共有的属性&#xff0c;是直接可以调用的 但是属性私有后&#xff0c;无法在直接.调用 只能通过getset调用 继承 super 可以直接调用父类中属性和方法&#xff0c;私有的无法做 其…

TCP详解及面试相关问题

文章目录1、计算机模型2、客户端和服务端通信——TCP协议&#xff08;1&#xff09;socket套接字&#xff08;2&#xff09;TCP三次握手——创建socket&#xff08;3&#xff09;连接的本质&#xff08;4&#xff09;TCP四次挥手——释放socket资源&#xff08;5&#xff09;TC…

如何用PHP实现消息推送

什么是消息推送 通过服务器自动推送消息到客户端(浏览器&#xff0c;APP&#xff0c;微信)的应用技术。 2. 为什么要使用消息推送技术 通常情况下都是用户发送请求浏览器显示用户需要的信息。推送技术通过自动传送信息给用户&#xff0c;来减少用于网络上搜索的时间。它根据…