1.什么是Junit
JUint是Java编程语言的单元测试框架,用于编写和运行可重复的自动化测试。
JUnit 促进了“先测试后编码”TDD的理念,强调建立测试数据的一段代码,可以先测试,然后再应用。这个方法就好比“测试一点,编码一点.......”,增加了程序员的产量和程序的稳定性,可以减少程序员的压力和花费在排错上的时间。
2.Junit注解
这些是Junit的部分注解
那我们Junit有哪些常用的注解呢
1.@Test
这一个注解作用于方法上面,表示这个方法是一个测试用例。当@Test注解作用在一个方法上面的时候,表示这一个方法是可以直接运行的,无需通过main方法来调用。放在哪就运行哪个类
2.@BeforeAll
首先,被@BeforeAll注释的方法一定是静态的,BeforeAll在@Test修饰的方法之前运行,@BeforeAll注释的方法一定是静态的,并且只会在加载外部类的时候执行一次,并不会在每一个方法执行之前再次执行了
3.@AfterAll
被这个注解修饰的方法也必须是静态的,在@Test修饰的方法之后进行运行
4.@BeforeEach
在执行每一个被@Test修饰的方法之前,都会执行一次@BeforeEach注释的方法。
代码如下
import org.junit.jupiter.api.*;
public class JunitTest {
@Test
void test01(){
System.out.println("===========这是一个测试用例============");
}
@Test
void test02(){
System.out.println("===========这是一个测试用例============");
}
@BeforeAll
static void start(){
System.out.println("开始测试");
}
@AfterAll
static void End(){
System.out.println("结束测试");
}
@BeforeEach
void startV1(){
System.out.println("开始一条测试用例");
}
@AfterEach
void EndV1(){
System.out.println("结束一条测试用例");
}
}
结果
5.@AfterEach
在执行每一个被@Test修饰的方法之后,都会执行一次@AfterEach注释的方法。
6.测试用例顺序指定
我们想要指定执行的顺序,我们就需要用一个注解@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
并在测试用例中加上Order()然后就可以指定执行顺序
2.注解的参数化
1.单参数
@ParameterizedTest
@ValueSource(ints={1,2,3,4,5})
void Test03(int x ){
System.out.println("接受的参数是x="+x);
}
单参数有局限性,只能接受一种类型的参数,对应的Test03()只能接受一个参数
2.多参数
@ParameterizedTest
@CsvSource({"'王五',20"})
void Test04(String name ,int age){
System.out.println(name+"今年"+age+"岁");
}
如图所知,这种方法可以执行多参数
我们的多参数文件还可以读取文件中的数据进行操作
@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void test05(String name,int age){
System.out.println("name="+name+",age="+age);
}
3.通过方法生成参数
@ParameterizedTest
@MethodSource("Generate")
void Test6(String name,int age){
System.out.println("name:"+name+"age:"+age);
}
public static Stream<Arguments> Generate() {
return Stream.of(
Arguments.arguments("张三",13),
Arguments.arguments("李四",10));
}
3.测试套件
1.通过class去运行测试用例
//通过class去运行测试用例
@Suite
@SelectClasses({JunitTest.class,JunitTest1.class})
public class RunTests {
}
2.通过package去运行测试用例
@Suite
@SelectPackages(value = {"example"})
public class RunTests {
}
4.断言
断言主要是判断
断言(assert):也就是所谓的assertion,是jdk1.4后加入的新功能
官话: 断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。 ——摘自百度百科【断言】
行话: 断言(Assertion)是一种调试程序的方式,断言可以在调试情况当错误排查,用于检查前条件,是我们的代码更加接近"契约式编程"
大白话:就是为了检测我们程序自己疏忽写出来的bug啦,当断言报错我就知道这里是我写错了
1.断言相等的表达式
表示当相等时才会成立,,不相等时会报错
2.断言不相等的表达式
表示当不相等时才会成立,相等时不通过
3.断言为空
表达式为空能通过,不为空不通过
4.断言不为空
表达式为空能不通过,不为空通过
5.自动化项目--博客系统
1.我们先要搭建好环境,拥有博客系统这个项目,详细看我的博客系统
2.编写出测试用例
3.我们根据测试用例写出自动化测试代码
1.登录的测试用例
public class Tests extends InitAndEndBrowser {
//登录测试用例
@ParameterizedTest
@CsvSource({"'http://49.233.1.44:9090/blog_login.html','zhangsan','http://49.233.1.44:9090/blog_list.html'"})
void login(String url,String username,String ex_url ) throws InterruptedException {
webDriver.get(url);
sleep(5000);
//输入用户名
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
//输入密码
webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
//提交
webDriver.findElement(By.cssSelector("#submit")).click();
sleep(3000);
//找登录成功后的校验是否登录成功
String Username=webDriver.findElement(By.cssSelector("body > div.container > div.left > div > h3")).getText();
if(Username.equals(username)){
System.out.println("测试通过");
}else {
System.out.println("测试不通过");
}
String cur_url=webDriver.getCurrentUrl();
if(cur_url.equals(ex_url)){
System.out.println("测试通过");
}else {
System.out.println("测试不通过");
}
}
2.博客列表的
@Test
void LoginError() throws InterruptedException {
String username="zhangsan";
String password="1234567";
webDriver.get("http://49.233.1.44:9090/blog_login.html");
sleep(3000);
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.findElement(By.cssSelector("#submit")).click();
String exurl=webDriver.getCurrentUrl();
// if(exurl.equals("http://49.233.1.44:9090/blog_login.html")){
// System.out.println("测试通过");
// }else {
// System.out.println("测试不通过");
// }
Assertions.assertEquals("http://49.233.1.44:9090/blog_login.html",exurl);
}
3.发布博客
@Test
void PublishBlog() throws InterruptedException {
//打开博客列表页
webDriver.get("http://49.233.1.44:9090/blog_list.html");
// 点击写博客的按钮
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
sleep(3000);
//document.querySelector("#title").value="测试"
((JavascriptExecutor)webDriver).executeScript("document.querySelector(\"#title\").value=\"测试\"");
sleep(2000);
//输入对应的标题(通过selenium执行js脚本来完成)
webDriver.findElement(By.cssSelector("#submit"));
//校验
//1,找到发布博客对应的标题
WebElement title=webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > " +
"div" +
".title"));
sleep(2000);
//2.校验标题对应的元素是否为空,如果不为空,说明测试通过,如果为空,测试不通过
Assertions.assertNotNull(title);
}
4.删除博客
@Order(3)
@Test
void DeleteBlog() throws InterruptedException {
webDriver.get("http://49.233.1.44:9090/blog_list.html");
webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > a")).click();
sleep(2000);
webDriver.findElement(By.cssSelector("body > div.container > div.right > div > div.operating > " +
"button:nth-child(2)")).click();
sleep(2000);
String url=webDriver.getCurrentUrl();
Assertions.assertEquals("http://49.233.1.44:9090/blog_list.html",url);
}
5.退出博客
@Order(4)
@Test
void QuitBlog() throws InterruptedException {
webDriver.get("http://49.233.1.44:9090/blog_list.html");
sleep(2000);
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
String url=webDriver.getCurrentUrl();
sleep(3000);
String name=webDriver.findElement(By.cssSelector("body > div.container-login > div > div:nth-child(2) > " +
"span")).getText();
Assertions.assertEquals("http://49.233.1.44:9090/blog_login.html",url);
Assertions.assertEquals("用户名",name);
}