博客系统自动化测试

news2024/11/16 5:46:37

1、博客列表页面测试

测试内容

测试代码:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogListTest extends Autotest{
    public static ChromeDriver driver = createDriver();
    // 准备工作
    @Test
    @BeforeAll
    static void ready() {
        driver.get("http://59.110.22.4:9011/blog_list.html");

    }
    // 导航栏测试
    @Test
    @Order(1)
    void navigationTest() throws InterruptedException {
        // 寻找 logo 图标
        driver.findElement(By.xpath("/html/body/div[1]/img"));
        // 寻找 "我的博客系统“
        Assertions.assertEquals("我的博客系统",driver.findElement(By.cssSelector("body > div.nav > span.title")).getText());
        // 寻找“主页”
        Assertions.assertEquals("主页",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).getText());
        // 寻找“写博客”
        Assertions.assertEquals("写博客",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).getText());
        // 寻找“登录”
        Assertions.assertEquals("登录",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).getText());

        // 点击写博客(未登录状态直接跳转到登录页面)
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        Assertions.assertEquals("http://59.110.22.4:9011/login.html",driver.getCurrentUrl());
        Thread.sleep(100);
        driver.navigate().back();
        // 点击登录
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        Assertions.assertEquals("http://59.110.22.4:9011/login.html",driver.getCurrentUrl());
        Thread.sleep(100);
        driver.navigate().back();

    }

    // 博客展示内容测试
    @Test
    @Order(2)
    void blogBriefTest() {
        // 寻找第一篇博客标题
        driver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title"));
        // 寻找第一篇博客发布/修改时间
        driver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.date"));
        // 寻找第一篇博客的内容简介
        driver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.desc"));
        // 寻找第一篇博客的“查看全文”按钮
        // 点击“查看全文”按钮查看功能是否有效
        WebElement button1 = driver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a"));
        Assertions.assertEquals("查看全文 >>",button1.getText());
        button1.click();
        // 将点击按钮后跳转到的网页的 URL与目标URL比较
        Assertions.assertEquals("http://59.110.22.4:9011/blog_content.html?id=1",driver.getCurrentUrl());
        // 返回上一页
        driver.navigate().back();

        // 寻找第二篇博客标题、发布时间、内容简介
        driver.findElement(By.cssSelector("#artListDiv > div:nth-child(2) > div.title"));
        driver.findElement(By.cssSelector("#artListDiv > div:nth-child(2) > div.date"));
        driver.findElement(By.cssSelector("#artListDiv > div:nth-child(2) > div.desc"));
        // 寻找第二篇博客的“查看全文”按钮
        // 点击“查看全文”按钮查看功能是否有效
        WebElement button2 = driver.findElement(By.cssSelector("#artListDiv > div:nth-child(2) > a"));
        Assertions.assertEquals("查看全文 >>",button2.getText());
        button2.click();

        // 判断当前网址和目标网址是否一致
        Assertions.assertEquals("http://59.110.22.4:9011/blog_content.html?id=2",driver.getCurrentUrl());
        driver.navigate().back();
    }
    // 首页、上一页、下一页、末页测试
    @Test
    @Order(3)
    void skipTest() {
        // 进入博客列表页时,已经位于首页,那么测试顺序就改成下一页,上一页,末页,首页
        WebElement nextPage = driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(3)"));
        Assertions.assertEquals("下一页",nextPage.getText());
        nextPage.click();
        // 判断当前网址是否和目标网址相同
        Assertions.assertEquals("http://59.110.22.4:9011/blog_list.html?pindex=2",driver.getCurrentUrl());

        // 测试上一页
        WebElement lastPage = driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(2)"));
        Assertions.assertEquals("上一页",lastPage.getText());
        lastPage.click();
        Assertions.assertEquals("http://59.110.22.4:9011/blog_list.html?pindex=1",driver.getCurrentUrl());

        // 测试末页
        WebElement tailPage = driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(4)"));
        Assertions.assertEquals("末页",tailPage.getText());
        tailPage.click();
        Assertions.assertEquals("http://59.110.22.4:9011/blog_list.html?pindex=3",driver.getCurrentUrl());

        // 测试首页
        WebElement headPage = driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)"));
        Assertions.assertEquals("首页",headPage.getText());
        headPage.click();
        Assertions.assertEquals("http://59.110.22.4:9011/blog_list.html",driver.getCurrentUrl());

    }
    @AfterAll
    @Test
    static void exit() {
        driver.quit();
    }

}
测试结果

三个测试用例全部通过

测试总结

通过上述的一系列操作,我们测试了博客列表页的导航栏和博客列表页的主体,在博客导航栏,左边的logo正常显示,logo旁边的“我的博客系统”正常显示,而且功能正常,右边的“主页”、“写博客”、“登录”均正常显示,并且功能正常;博客列表页的主体有两篇博客,第二篇博客下面有四个按钮:首页、上一页、下一页、末页。通过测试,我们发现博客的标题、发布博客的时间、博客的简介、查看全文按钮均正常显示,查看全文按钮功能正常。首页、上一页、下一页、末页四个按钮均正常显示且功能正常。

2、注册页面测试

测试用例

测试代码:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RegisterTest {
    public static ChromeDriver driver = createDriver();
    // 准备工作
    @Test
    @BeforeAll
    static void ready() {
        driver.get("http://59.110.22.4:9011/reg.html");


    }
    // 导航栏测试
    @Test
    @Order(1)
    void navigationTest() {
        // 寻找 logo 图标
        driver.findElement(By.xpath("/html/body/div[1]/img"));
        // 寻找 "我的博客系统“
        Assertions.assertEquals("我的博客系统",driver.findElement(By.cssSelector("body > div.nav > span.title")).getText());
        // 寻找“主页”
        Assertions.assertEquals("主页",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).getText());
        // 寻找“写博客”
        Assertions.assertEquals("写博客",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).getText());
        // 寻找“登录”
        Assertions.assertEquals("登录",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).getText());
    }
    // 检查页面元素是否存在
    @Test
    @Order(2)
    void findPageTest() {
        driver.findElement(By.cssSelector("body > div.login-container > div"));
        Assertions.assertEquals("注册",driver.findElement(By.cssSelector("body > div.login-container > div > h3")).getText());
        Assertions.assertEquals("用户名",driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(2) > span")).getText());
        Assertions.assertEquals("密码",driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(3) > span")).getText());
        Assertions.assertEquals("确认密码",driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(4) > span")).getText());
        Assertions.assertEquals("提交",driver.findElement(By.cssSelector("#submit")).getText());
        // 寻找三个输入框
        driver.findElement(By.cssSelector("#username"));
        driver.findElement(By.cssSelector("#password"));
        driver.findElement(By.cssSelector("#password2"));

    }

    @Order(3)
    @ParameterizedTest
    @CsvSource({"jcm,123,123"})
    void falseRegTest(String username, String password, String password2) throws InterruptedException {
        // 注册已经存在的账号
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        driver.findElement(By.cssSelector("#password2")).clear();
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("#password2")).sendKeys(password2);
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(100);
        Alert alert = driver.switchTo().alert();
        Assertions.assertEquals("执行失败,请稍后再试!",alert.getText());
        alert.accept();

    }

    @Order(4)
    @ParameterizedTest
    @CsvSource({"cmcm666,123,456"})
    void falseRegTest2(String username, String password, String password2) throws InterruptedException {
        // 注册时,密码和确认密码不一致
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        driver.findElement(By.cssSelector("#password2")).clear();
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("#password2")).sendKeys(password2);
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(100);
        Alert alert = driver.switchTo().alert();
        Assertions.assertEquals("两次密码输入的不一致,请先检查!",alert.getText());
        alert.accept();

    }

    @Order(5)
    @ParameterizedTest
    @CsvSource({"cmcm666,123,123"})
    void trueRegTest(String username, String password, String password2) throws InterruptedException {
        // 注册不存在的账号
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();
        driver.findElement(By.cssSelector("#password2")).clear();
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.findElement(By.cssSelector("#password2")).sendKeys(password2);
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(100);
        Alert alert = driver.switchTo().alert();
        Assertions.assertEquals("注册成功!是否跳转到登录界面?",alert.getText());
        alert.accept();

    }

    @AfterAll
    @Test
    static void exit() {
        driver.quit();
    }
}
测试结果

通过测试发现一个bug,在注册页面,导航栏的右边应该是“登录”而不是“登陆”。

接下来我们将刚才发现的bug在代码中先屏蔽掉,再次进行测试。

通过测试发现,测试用例全部通过没有bug。

测试总结

在上面我们对注册页面进行了两方面测试:页面显示和功能模块。通过测试我们得出结论:

  1. 注册页面的导航栏和整体布局可以正常显示,注册框中的文字、按钮均可以正常显示,但是导航栏最右边的”登录“字体存在bug。
  2. 用户如果注册一个已经存在的账号时,页面会提示用户“执行失败,请稍后再试!”。
  3. 用户在注册过程中,如果密码和确认密码不一致,页面会提示用户两次密码不一致,让用户进行检查。
  4. 注册页面的注册功能在注册一个不存在的用户时,按照正确的注册规则可以成功注册一个账号。

注册页面中存在一个bug:导航栏最右侧“登录”字样错误,并没有正确显示,而是显示“登陆”。

3、登录页面测试

测试用例

测试代码:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest extends Autotest {
    public static ChromeDriver driver = createDriver();
    // 准备工作
    @Test
    @BeforeAll
    static void ready() {
        driver.get("http://59.110.22.4:9011/login.html");
    }
    // 导航栏测试
    @Test
    @Order(1)
    void navigationTest() throws InterruptedException {
        // 寻找 logo 图标
        driver.findElement(By.xpath("/html/body/div[1]/img"));
        // 寻找 "我的博客系统“
        Assertions.assertEquals("我的博客系统",driver.findElement(By.cssSelector("body > div.nav > span.title")).getText());
        // 寻找“主页”
        Assertions.assertEquals("主页",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).getText());
        // 寻找“写博客”
        Assertions.assertEquals("写博客",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).getText());
        // 寻找“登录”
        Assertions.assertEquals("登录",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).getText());

        // 点击主页,跳转到博客列表页面,
        // 未登录的情况下,点击写博客和登录,都会跳转到登录页面,不再测试
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();
        Assertions.assertEquals("http://59.110.22.4:9011/blog_list.html",driver.getCurrentUrl());
        Thread.sleep(100);
        driver.navigate().back();
    }

    // 检查页面元素是否存在
    @Test
    @Order(2)
    void findPageTest() {
        driver.findElement(By.cssSelector("body > div.login-container > div"));
        Assertions.assertEquals("登录",driver.findElement(By.cssSelector("body > div.login-container > div > h3")).getText());
        Assertions.assertEquals("用户名",driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(2) > span")).getText());
        Assertions.assertEquals("密码",driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(3) > span")).getText());
        Assertions.assertEquals("登录",driver.findElement(By.cssSelector("#submit")).getText());
        Assertions.assertEquals("注册",driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(5) > button")).getText());
        // 寻找用户名输入框和密码输入框
        driver.findElement(By.cssSelector("#username"));
        driver.findElement(By.cssSelector("#password"));
    }

    @Order(3)
    @Test
    void skipRegTest() throws InterruptedException {
        // 跳转到注册页面测试
        driver.findElement(By.cssSelector("body > div.login-container > div > div:nth-child(5) > button")).click();
        Assertions.assertEquals("http://59.110.22.4:9011/reg.html",driver.getCurrentUrl());
        Thread.sleep(100);
        driver.navigate().back();
    }
    @Order(4)
    @ParameterizedTest
    @CsvSource({"cmcm666,000"})
    void falseLoginTest1(String username, String password) throws InterruptedException {
        // 密码错误的情况
        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(100);
        // 查看 alert
        Alert alert = driver.switchTo().alert();
        Assertions.assertEquals("用户名或密码输入错误,请重试!",alert.getText());
        alert.accept();

    }

    @Order(5)
    @ParameterizedTest
    @CsvSource({"cmcmcm,123"})
    void falseLoginTest2(String username, String password) throws InterruptedException {
        // 用户名不存在的情况
        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(100);
        // 查看 alert
        Alert alert = driver.switchTo().alert();
        Assertions.assertEquals("用户名或密码输入错误,请重试!",alert.getText());
        alert.accept();

    }

    @Order(6)
    @ParameterizedTest
    @CsvSource({"cmcm666,123"})
    void trueLoginTest(String username, String password) throws InterruptedException {
        // 用户名和密码都正确的情况
        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(100);
        // 比较 URL
        Assertions.assertEquals("http://59.110.22.4:9011/myblog_list.html",driver.getCurrentUrl());

    }
    @AfterAll
    @Test
    static void exit() {
        driver.quit();
    }
}
测试结果

检测出两个bug:

两个bug均是“登录”字样出现错误。接下来我们先将两个错误从代码中屏蔽,再进行测试。

经过测试发现,测试用例全部通过。

测试总结

上面我们对登录页面进行了两方面测试:页面显示和功能模块。通过测试我们得出结论:

  1. 登录页面的导航栏和整体布局可以正常显示,登录框中的文字,输入框均可以正常显示,但是导航栏最右边的”登录“字体存在bug,而且登录框中的“登录”标题也存在bug。
  2. 在用户名不存在的情况下进行登录,则会提示“用户名或密码输入错误,请重试!”,无法登录,功能正常。
  3. 在密码错误的情况下进行登录,则会提示“用户名或密码输入错误,请重试!”,无法登录,功能正常。
  4. 在用户名和密码正确的情况下,点击登录按钮,会跳转到“我的博客列表”页面,功能正常。
  5. 在点击注册按钮时,会跳转到注册页面,功能正常。

注册页面中存在两个bug:

1、导航栏最右侧“登录”字样错误,并没有正确显示,而是显示“登陆”。

2、登录框中标题“登录”字样错误,并没有正确显示,而是显示“登陆”。

4、我的博客列表页面测试

测试用例

测试代码:

public class MyBlogListTest extends Autotest {
    public static ChromeDriver driver = createDriver();
    public static String username = "lisi";
    public static String password = "12345";
    // 准备工作
    @Test
    @BeforeAll
    static void ready() throws InterruptedException {
        driver.get("http://59.110.22.4:9011/login.html");
        // 登录账号(已知 lisi 已经写了四篇博客)
        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(100);
        Assertions.assertEquals("http://59.110.22.4:9011/myblog_list.html",driver.getCurrentUrl());
    }

    // 查找用户信息
    @Order(1)
    @Test
    void findUserInfo() {
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div > img"));
        // 比较用户名和登录时的用户名是否一致
        Assertions.assertEquals(username,driver.findElement(By.cssSelector("#username")).getText());
        Assertions.assertEquals("github 地址",driver.findElement(By.cssSelector("body > div.container > div.container-left > div > a")).getText());
        Assertions.assertEquals("文章",driver.findElement(By.cssSelector("body > div.container > div.container-left > div > div:nth-child(4) > span:nth-child(1)")).getText());
        Assertions.assertEquals("分类",driver.findElement(By.cssSelector("body > div.container > div.container-left > div > div:nth-child(4) > span:nth-child(2)")).getText());
        driver.findElement(By.cssSelector("#artCount"));
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div > div:nth-child(5) > span:nth-child(2)"));

    }

    // 查找文章信息并测试文章按钮
    @Order(2)
    @Test
    void findArtInfo() {
        driver.findElement(By.cssSelector("#artDiv > div:nth-child(1)"));
        driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > div.title"));
        driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > div.date"));
        driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > div.desc"));
        Assertions.assertEquals("查看全文>>",driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > a:nth-child(4)")).getText());
        Assertions.assertEquals("修改文章>>",driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > a:nth-child(5)")).getText());
        Assertions.assertEquals("删除文章 >>",driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > a:nth-child(6)")).getText());

        // 查看全文按钮测试
        driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > a:nth-child(4)")).click();
        Assertions.assertEquals("http://59.110.22.4:9011/blog_content.html?id=2",driver.getCurrentUrl());
        driver.navigate().back();
        // 修改文章按钮测试
        driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > a:nth-child(5)")).click();
        Assertions.assertEquals("http://59.110.22.4:9011/blog_edit.html?id=2",driver.getCurrentUrl());
        driver.navigate().back();
        // 删除文章按钮测试
        driver.findElement(By.cssSelector("#artDiv > div:nth-child(1) > a:nth-child(6)")).click();
        Alert alert = driver.switchTo().alert();
        Assertions.assertEquals("确认是否删除?",alert.getText());
        // 点击确定删除文章,点击取消放弃删除
//        alert.accept();
        alert.dismiss();
    }

    // 导航栏测试
    @Test
    @Order(3)
    void navigationTest() throws InterruptedException {
        // 寻找 logo 图标
        driver.findElement(By.xpath("/html/body/div[1]/img"));
        // 寻找 "我的博客系统“
        Assertions.assertEquals("我的博客系统",driver.findElement(By.cssSelector("body > div.nav > span.title")).getText());
        // 寻找“主页”
        Assertions.assertEquals("主页",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).getText());
        // 寻找“写博客”
        Assertions.assertEquals("写博客",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).getText());
        // 寻找“退出”
        Assertions.assertEquals("退出",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).getText());

        // 点击主页,跳转到博客列表页面,
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();
        Assertions.assertEquals("http://59.110.22.4:9011/blog_list.html",driver.getCurrentUrl());
        Thread.sleep(100);
        driver.navigate().back();
        // 点击写博客,跳转到添加博客页面
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        Assertions.assertEquals("http://59.110.22.4:9011/blog_add.html",driver.getCurrentUrl());
        Thread.sleep(100);
        driver.navigate().back();

        // 点击退出,退出登录账号
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        Alert alert = driver.switchTo().alert();
        Assertions.assertEquals("确认注销?",alert.getText());
        // 点击确定退出账号,点击取消,取消退出账号
//        alert.accept();
        alert.dismiss();
        // 查看当前页面是否还在我的博客列表页面
        Assertions.assertEquals("http://59.110.22.4:9011/myblog_list.html",driver.getCurrentUrl());
    }

    @AfterAll
    @Test
    static void exit() {
        driver.quit();
    }
}
测试结果

通过测试发现一个bug:在点击导航栏的退出后,如果点击取消按钮,依然会退出账号。

测试总结

在上面我们对我的博客列表页面进行了两方面测试:页面显示和功能模块。通过测试我们得出结论:

  1. 我的博客列表页面的导航栏和整体布局可以正常显示。
  2. 左侧用户信息栏可以正确显示用户的信息,右侧博客列表栏也可以正确显示用户所写的博客。
  3. 右侧博客列表栏中的查看全文按钮、修改文章按钮、删除文章按钮都可以正确执行。
  4. 导航栏右侧退出按钮存在功能问题,点击退出之后弹出一个提示框,点击确定应该退出账号,点击取消应该停留在原页面,但是点击取消之后依然会退出账号。

我的博客列表页面在页面显示正常,查看全文、修改文章、删除文章按钮功能均正常,但是导航栏的退出按钮功能异常,无论选择确定还是取消都是退出账号。

5、博客正文页面测试

测试用例

测试代码:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogContentTest extends Autotest {
    public static ChromeDriver driver = createDriver();
    // 准备工作
    @Test
    @BeforeAll
    static void ready() {
        driver.get("http://59.110.22.4:9011/blog_content.html?id=1");

    }
    // 导航栏测试
    @Test
    @Order(1)
    void navigationTest() throws InterruptedException {
        // 寻找 logo 图标
        driver.findElement(By.xpath("/html/body/div[1]/img"));
        // 寻找 "我的博客系统“
        Assertions.assertEquals("我的博客系统",driver.findElement(By.cssSelector("body > div.nav > span.title")).getText());
        // 寻找“主页”
        Assertions.assertEquals("主页",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).getText());
        // 寻找“写博客”
        Assertions.assertEquals("写博客",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).getText());
        // 寻找“登录”
        Assertions.assertEquals("登录",driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).getText());

        // 点击写博客(未登录状态直接跳转到登录页面)
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        Assertions.assertEquals("http://59.110.22.4:9011/login.html",driver.getCurrentUrl());
        Thread.sleep(100);
        driver.navigate().back();

    }
    @Test
    @Order(2)
    void findUserInfo() {
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div > img"));
        // 比较用户名和登录时的用户名是否一致
        driver.findElement(By.cssSelector("#username"));
        Assertions.assertEquals("gitee",driver.findElement(By.cssSelector("body > div.container > div.container-left > div > a")).getText());
        Assertions.assertEquals("文章",driver.findElement(By.cssSelector("body > div.container > div.container-left > div > div:nth-child(4) > span:nth-child(1)")).getText());
        Assertions.assertEquals("分类",driver.findElement(By.cssSelector("body > div.container > div.container-left > div > div:nth-child(4) > span:nth-child(2)")).getText());
        driver.findElement(By.cssSelector("#artCount"));
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div > div:nth-child(5) > span:nth-child(2)"));

    }
    // 查找文章信息并测试文章按钮
    @Order(3)
    @Test
    void findArtInfo() throws InterruptedException {
        driver.findElement(By.cssSelector("#title"));
        driver.findElement(By.cssSelector("#updatetime"));
        driver.findElement(By.cssSelector("#rcount"));
        driver.findElement(By.cssSelector("#editorDiv"));

        // 验证阅读量是否正确增加
        String rcount1 = driver.findElement(By.cssSelector("#rcount")).getText();
        int count1 = Integer.parseInt(rcount1);
        Thread.sleep(200);
        driver.navigate().refresh();
        String rcount2 = driver.findElement(By.cssSelector("#rcount")).getText();
        Assertions.assertEquals(count1+1,Integer.parseInt(rcount2));
    }

    @AfterAll
    @Test
    static void exit() {
        driver.quit();
    }

}
测试结果

三个测试用例,有两个通过,发现一个bug:因为测试时并未登录账号,所以导航栏右侧应该是“登录”,而页面中显示的却是“退出”。

测试总结

上面我们对博客正文页面进行了两方面测试:页面显示和功能模块。通过测试我们得出结论:

  1. 博客正文的导航栏和整体布局可以正常显示。
  2. 左侧用户信息栏可以正确显示作者的信息,右侧博客列表栏也可以正确显示博客的详细内容。
  3. 博客内容中的阅读量在刷新之后会增加一次,阅读量可以正确更新。
  4. 测试时并未登录账号,所以导航栏右侧应该是“登录”,而页面中显示的却是“退出”。

博客正文页面的功能模块正常,没有发现bug,但是页面显示出现bug,导航栏右侧显示的“退出”应该为“登录”。

6、添加博客页面测试

测试用例

代码示例:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogAddTest extends Autotest {
    public static ChromeDriver driver = createDriver();
    public static String username = "lisi";
    public static String password = "12345";
    // 准备工作
    @Test
    @BeforeAll
    static void ready() throws InterruptedException {
        driver.get("http://59.110.22.4:9011/login.html");
        // 登录账号(已知 lisi 已经写了四篇博客)
        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(100);
        Assertions.assertEquals("http://59.110.22.4:9011/myblog_list.html",driver.getCurrentUrl());
    }

    // 查找用户信息
    @Order(1)
    @Test
    void findUserInfo() {
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div > img"));
        // 比较用户名和登录时的用户名是否一致
        Assertions.assertEquals(username,driver.findElement(By.cssSelector("#username")).getText());
        Assertions.assertEquals("github 地址",driver.findElement(By.cssSelector("body > div.container > div.container-left > div > a")).getText());
        Assertions.assertEquals("文章",driver.findElement(By.cssSelector("body > div.container > div.container-left > div > div:nth-child(4) > span:nth-child(1)")).getText());
        Assertions.assertEquals("分类",driver.findElement(By.cssSelector("body > div.container > div.container-left > div > div:nth-child(4) > span:nth-child(2)")).getText());
        driver.findElement(By.cssSelector("#artCount"));
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div > div:nth-child(5) > span:nth-child(2)"));
    }
    @Order(2)
    @Test
    void skipAdd() throws InterruptedException {
//        跳转到添加博客页面
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        // 查找添加博客页面“发布文章”按钮
        Assertions.assertEquals("发布文章",driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).getText());
    }
    @Order(3)
    @Test
    void addContent() {
        WebElement title = driver.findElement(By.cssSelector("#title"));
        title.clear();
        title.sendKeys("个人博客系统测试");

        driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
        // 点击发布文章之后会出现两个提示框,第一个是“确认提交”提示框
        // 点击确定之后,则会发布文章,点击取消则停留在原页面
        Alert alert1 = driver.switchTo().alert();
//        alert1.dismiss();
        alert1.accept();

    }
    @AfterAll
    @Test
    static void exit() {
        driver.quit();
    }
}
测试结果

三个测试用例全部通过,但是并不说添加博客页面没有bug, 我们并没有测试添加博客页面的所有内容

上图中圈中的区域,因为太复杂我们就没有测试,但是可以看出,这一部分是存在bug的,因为大部分图标都没有显示出来,而是显示的□

测试总结

在上面我们对添加博客页面进行了两方面测试:页面显示和功能模块。通过测试我们得出结论:

  1. 添加博客页面的导航栏和整体布局可以正常显示。
  2. 在格式选择模块中,只有将小写字母转换成大写、将大写字母转换成小写、一~六号标题的图标正常显示,其他格式的图标都显示□,存在一个bug。
  3. 编写博客模块和内容显示模块显示正常。
  4. 点击发布文章,文章能够正常保存在列表中,保存博客功能正常。
  5. 退出功能异常,在退出时,点击确定能够正常退出账号,但是点击取消依然会退出账号。(我的博客列表页面进行过测试)

添加博客列表页面在页面显示和功能模块个存在一个bug:

1、页面显示:格式选择模块中的图片不能完全显示出来,大部分都是显示□。

2、功能模块:退出功能异常,点击取消,仍然会退出账号。

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

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

相关文章

适用于 Mac 电脑的 10 款最佳数据恢复工具集

无论是个人照片还是重要的商业文档,对于那些依赖计算机获取重要文件的人来说,数据丢失都是一场噩梦。 值得庆幸的是,Mac用户可以使用各种数据恢复工具,可以帮助您恢复丢失或意外删除的文件。 在本文中,我们将采用适用于…

RAM(recognize anything)—— 论文详解

一、概述 1、是什么 RAM 论文全称 Recognize Anything: A Strong Image Tagging Model。区别于图像领域常见的分类、检测、分割,他是标记任务——即多标签分类任务(一张图片命中一个类别),区分于分类(一张图片命中一个…

Unity Meta Quest 一体机开发:前期准备和环境配置(2023 版,Oculus Integration v57)

​ 文章目录 📕教程说明📕思维导图概括📕开发者模式📕可下载的软件⭐Oculus 电脑客户端⭐SideQuest⭐Meta Quest Developer Hub⭐Unity Hub 📕安装 Unity 时需要添加的模块📕设置 Unity 的 Build Settings…

构建高性能应用的利器:Nginx反向代理及配置详解

一、Nginx概念解读 对于新事物的理解,最好的方式就是从概念入手,本文作为《Nginx专题》系列文章的第一篇,先从Nginx的名称开始来分解这个神秘的引擎。 Nginx,是engine X的缩写,发音也是engine x,2004年由…

安装dai li

https://xn–6nq44r2uh9rhj7f.com/#/knowledge 先gomai订阅, 在打开使用文档

【大数据】Kafka 实战教程(二)

Kafka 实战教程(二) 1.下载2.安装3.配置4.运行4.1 启动 Zookeeper4.2 启动 Kafka 5.第一个消息5.1 创建一个 Topic5.2 创建一个消息消费者5.3 创建一个消息生产者 1.下载 你可以在 Kafka 官网:http://kafka.apache.org/downloads&#xff0c…

绝对不可错过的6个搜索引擎网站,超级值得收藏

https://www.gobaidugle.com/ 一个全能的搜索引擎网站,支持设置多种搜索模式,可以根据需求选择双搜、三搜、单搜等方式。 如果是双搜的话你可以看到多种搜索结果,能够一键搜索到自己需要的内容,非常简单快捷。 2、懒盘搜索 htt…

物联网AI MicroPython传感器学习 之 GC7219点阵屏驱动模块

学物联网,来万物简单IoT物联网!! 一、产品简介 LED-8 * 32点阵屏显示板由 4 块单色 8x8 共阴红色点阵单元组成,通过 SPI 菊花链模式将多块显示屏连接后可以组成更大的分辨率显示屏幕,任意组合分辨率。可用于简单仪表显…

义乌再次位列第一档!2022年跨境电商综试区评估结果揭晓!

义乌跨境电商综试区捷报频传,在商务部公布的“2022年跨境电子商务综合试验区评估”结果中,中国(义乌)跨境电子商务综合试验区(以下简称:“跨境综试区”)评估结果为成效明显,综合排名…

Qt扫盲-QImage 理论总结

QImage 理论总结 一、概述二、读写图像文件三、图像信息四、像素操作1. 32位2. 8位 五、图像格式六、图像转换 一、概述 QImage类提供了一个独立于硬件的图像表示,允许直接访问像素数据,并且可以用作绘画设备。Qt提供了四个类来处理图像数据&#xff1a…

volatile-可见性案例详解

6.3 volatile特性 6.3.1 保证可见性 保证不同线程对某个变量完成操作后结果及时可见,即该共享变量一旦改变所有线程立即可见 不加volatile,没有可见性,程序无法停止 加了volatile,保证可见性,程序可以停止 public…

爱创科技携手洽洽食品,探索渠道数字化最优解!

坚果的下半场,是从吃到喝。 消费升级大潮下,健康养生理念逐渐深入人心。以“天然健康”为核心的食品新消费潮流正加速形成,一个个打着“美味与营养”黄金设定的品类风口正被不断创建,其中人气有增无减的当属植物基饮品。据相关报告…

数据结构详细笔记——树

文章目录 树的定义和基本术语结点、树的属性描述有序树与无序树树与森林 树的常考性质树的存储结构双亲表示法(顺序存储)孩子表示法(顺序链式存储)孩子兄弟表示法(链式存储) 树和森林的遍历树的遍历森林的遍…

JVM、JRE、JDK

JVM JVM(Java Virtual Machine)是Java虚拟机的缩写,他是Java编程语言运行时环境,负责执行Java字节码。另外作为JVM虚拟机,它在各种操作系统上提供统一的平台,这帮助Java应用程序可以独立于操作系统底层运行…

Python自动化测试selenium指定截图文件名方法

这篇文章主要介绍了Python自动化测试selenium指定截图文件名方法,Selenium 支持 Web 浏览器的自动化,它提供一套测试函数,用于支持 Web 自动化测试,下文基于python实现指定截图文件名方法,需要的小伙伴可以参考一下 前…

Redis入门概述

Redis入门概述 1.redis是什么 是一种存在内存中的数据库。遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库。并且可以提供提供多种语言的 API。提供了主从模式、Redis Sentinel和Redis Cluster集群架构方案。总结来说redis是基于内存…

Ubuntu 下 VSCode Tab 间距非常小解决方案

Ubuntu 的 Tag 键很小,不利于阅读代码,检查 Tab Size 配的也没问题,也是4 解决方案为: 进入 设置-> 字体,把 红框中的 ‘Droid Sans Mono’, 删了 修改后如下: 再次回到代码界面,可以…

【框架源码篇 06】Spring源码题目

Spring源码面试题 谈谈你对Spring框架的理解? Spring 是一个开源的应用程序框架,它起源于 Rod Johnson 在其著名的 Spring Framework 专著中提出的一个轻量级框架的观念。下面是 Spring 的发展历史: 2002 年,Rod Johnson 发表了他的专著 …

硬盘驱动器(HDD)伺服系统鲁棒控制

在存在参数变化、非线性和噪声的情况下,轨道跟踪控制器必须实现更严格的调节。因此,利用闭环伺服系统采用μ合成和H∞优化等先进设计方法,实现鲁棒稳定性和鲁棒性能是合适的。 该磁盘组件由几个被称为圆盘的扁平磁盘组成,其两侧都…

找不到concrt140.dll无法继续执行此代码的解决方法总结,快速解决dll问题的5种方法

最近,我在使用电脑的过程中遇到了一个问题,即“找不到concrt140.dll无法继续执行此代码”。通过查阅资料和自己的实践,我了解到concrt140.dll是Microsoft Visual C 2015 Redistributable中的一个动态链接库文件。它提供了一些用于支持多线程编…