一、项目背景
1、个人博客系统采用前后端分离,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要由登录页、列表页、详情页以及编辑页四个页面构成;后端实现了登录、编辑博客、注销、删除博客、以及强制登录等功能。模拟实现了最简单的个人博客系统。
2、该系统可对用户简单博客及进行记录,可查看时间、标题、内容、发布者等详细信息。
二、项目功能
该系统主要实现了登录、注销、写博客以及删除博客等功能。
1、登录功能:用户名以及密码已经在后端写入了数据库,没有实现账户注册功能,即:用户名以及密码是已经存在的。
2、列表页面:可以在列表页查看有限数量的博客简介,其包括博客标题、发布时间以及内容概要。在左侧可以看到登录的用户以及文章数、分类数等模块。在右上角有主页、写博客和注销三个功能:主页即列表页,写博客即博客编辑页,注销即退出登录,回到登录页面。
3、详情页面:在列表页面点击“查看全文”按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页、写博客、删除和注销四个功能;删除即删除该篇博客,删除之后就会跳转到列表页面,该篇博客就被成功删除。
4、写博客:在登录之后的任意界面点击“写博客”之后就会进入博客编辑页面,此时就可以进行博客的编写,点击“发布文章”后就可以成功发布文章,此时就会跳转到列表页。
三、手工测试
1、测试用例设计
2、部分主要功能测试
1)登录测试:
2)写博客测试:
3)发布成功,显示在列表页:
4)查看刚才发布博客额详情页面:
5)删除博客:点击删除按钮 删除成功 跳转到列表页 第一篇博客已经不是刚才发布的那篇了:
6)退出登录:点击注销,跳转到登录页面,同时登录框里的账号密码已经被清除
四、自动化测试
1、自动化测试步骤
1)熟悉项目;
2)针对核心流程设计手工测试用例;
3)将手工测试用例转化为自动化测试用例;
4)创建自动化项目
2、自动化测试用例
3、自动化代码编写
1)添加相关依赖至pom.xml中
<dependencies>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite-api</artifactId>
<version>1.9.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
2)新建blog包并创建测试类和公共类InitAndEnd.class
①公共类InitAndEnd.class:
公共属性(创建驱动、关闭浏览器)应用BeforeAll和AfterAll单独放在了InitAndEnd.class中;
②登陆页面测试BlogLoginTest01:
A.测试登录页面是否正常打开;
B.测试正常登录;
C.测试异常登录;
③列表页面测试BlogListTest01:
A.测试博客列表页面是否可以正常打开;
B.测试点击列表页面的“查看全文”按钮是否可以跳转到详情页面;
C.测试未登录是否会直接跳转到登录页面,顺便测试了“注销”按钮;
④编辑页面测试BlogEditTest01:
A.测试编辑页面是否可以正常打开;
B.测试博客是否可以正常发布博客,包括元素齐全和空缺;
⑤详情页面测试BlogDetailTest01:
A.测试详情页面是否可以正常打开;
B.测试写博客按钮是否可以正常使用,测试删除博客按钮是否可以正常使用;使用时间进行比较,因为博客可能是没有标题的,但是发布时间是有的;
⑥测试套件runSuite:
测试套件的运行,使用时以测试类作为对应的执行顺序。
⑦注意事项:
A.根据XMind编写的测试用例:每个页面一个测试类,在每个测试类中进行具体个功能实现;
B.使用测试套件Suite便于运行和修改;
C.在登录页面,打开列表页、详情页、编辑页,提交等操作后加隐式等待,确保页面正常加载。
D.每个测试类里面注意测试顺序,使用Order注解指定;
E.列表页面、详情页面、编辑页面都必须在登录状态下才能进入,所以要在这三个页面的测试类中第一步都是要进行登录,进入成功登录的状态;
3)自动化测试参考代码
地址:https://gitee.com/Melody-0824/test-code/tree/master/blog
4、自动化测试结果
所有测试用例均已通过,如图所示:
五、总结
1、一定要关注测试用例的执行顺序;
2、注意多参数CSV测试页面导航问题;
3、列表页面、详情页面、编辑页面都必须在登录状态下才能进入;
4、@SelectClasses的参数可以指定测试顺序,是测试类的顺序,不是用例的顺序;
5、测试用例并不是越多越好。
六、难点及亮点
1、难点
1)设计好测试类的执行顺序,每个测试类里面的测试用例的执行顺序,确保逻辑的准确性;
2)在合适的位置适当的加入隐式等待,确保页面加载完成,提高自动化测试的稳定性。
2、亮点
1)根据测试用例使用Selenium3自动化测试工具+Junit5单元测试框架来实现web自动化测试;
2)使用了JUnit5中提供的注解:避免生成过多的对象,造成资源和时间的浪费,提高了自动化的执行效率;
3)公共类里面只继续宁创建一次驱动和关闭依次浏览器操作,避免每个用例重复创建驱动对象造成时间和资源的浪费;
4)使用参数化:保持用例的简洁,提高代码的可读性;
5)使用测试套件:降低了测试人员的工作量,通过套件一次执行所有要运行的测试用例;
6)使用了等待:提高了自动化的运行效率,提高了自动化的稳定性,减小误报的可能性。
七、缺点及改进的地方
1、该项目没有设计用户注册功能,只能提前在数据库中存储用户信息后经过校验登录;并且用户头像不能自己设定,在进行前端页面的书写过程中已经将头像的图片写为静态了;而用户信息中的文章数以及分类数也没有在后端中具体实现,直接在前端页面中写为了静态的。
改进点:用户可以进行注册;用户可以设定自己的头像;用户信息中的文章数和分类数实时根据发布博客的数量的分类进行更新;用户注册的时候同时填写自己的Gitee地址。
2、驱动关闭的位置在公共类中,每一个测试用例的执行都会创建驱动和关闭浏览器;因为驱动的测试是要在最后一个测试类完成之后进行释放的,使用@AfterAll注解,那么每次修改测试类的时候都会需要挪动驱动释放的位置;
改进点:驱动关闭的位置:在最后一个测试类的最后一个测试用例结束之后进行关闭。为了避免遗漏or遗忘驱动释放的位置,可以单独写一个类来存放驱动释放,然后直接放到套件测试类的最后。
3、没有保存现场的操作;
改进点:使用屏幕截图:方便问题的追溯以及问题的解决。把所有的用例的执行结果保存下来,方便后续查错或查看,在公共类中进行该方法的定义。注意屏幕截图保存的方式:动态时间戳并进行时间格式化,然后期望按照某种维度(天、周)以文件夹的方式进行保存。
4、观察到自动化测试时间较长;
改进点:性能需要进一步优化。