网站建设开发的条件,徐州模板厂,网站建设工作职责,扬州网页制作公司目录
一、认识Junit框架
Junit和Selenium的关系是什么
导入Junit框架common-io包
二、Junit框架的使用
2.1Junit有哪些常用注解
2.1.1Test注解
2.1.2BeforeEach
2.1.3BeforeAll
2.1.4AfterAll
2.1.5AfterEach
2.2Junit的断言
Assertions.assertEquals(期待值#…目录
一、认识Junit框架
Junit和Selenium的关系是什么
导入Junit框架common-io包
二、Junit框架的使用
2.1Junit有哪些常用注解
2.1.1Test注解
2.1.2BeforeEach
2.1.3BeforeAll
2.1.4AfterAll
2.1.5AfterEach
2.2Junit的断言
Assertions.assertEquals(期待值真实值);
2.2.1Assertions.assertNotEquals(百度一下,text)
2.2.2Assertions.assertTrue(text.equals(百度一下))
2.2.3Assertions.assertNull(a);
三、用例的执行顺序
①针对方法的排序
为什么需要用到juit的排序功能
四、测试套件(Suit)
Suite
SelectClasses({待测试的类.class})
SelectPackages(包名)
五、参数化
5.1ParameterizedTest、ValueSource(strings {})
5.2CsvSource(value{第一组数据,第二组数据}) 如果参数当中包含逗号,就需要使用单引号转义字符串
5.3读取文件参数CsvFileSource(resources/文件名称) 5.3.1读取其他磁盘文件的操作指定文件为files...
5.4动态参数(单参数版本)
5.5动态参数(多参数版本)
六、对于重要测试场景的截图
第一步定位到需要的页面
第二步调用getSrceenshotAs方法传入的擦参数是OutputTpye.FILE
第三步新建一个File类指定路径
第四步调用copyFile方法把生成的文件放到指定的目录当中 一、认识Junit框架
Junit是一个开源的Java语言的单元测试框架。
回顾一下单元测试就是在编码阶段一般情况下由开发进行的测试。
Junit和Selenium的关系是什么 Junit是单元测试框架而selenium是web自动化测试框架。如果把selenium比作灯泡那么junit就是电灯。因此一般情况下junit负责运行selenium脚本编写的代码。 导入Junit框架common-io包
dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.6/version/dependencydependencygroupIdorg.seleniumhq.selenium/groupIdartifactIdselenium-java/artifactIdversion4.8.1/version/dependencydependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter-api/artifactIdversion${junit.version}/versionscopetest/scope/dependencydependencygroupIdorg.junit.platform/groupIdartifactIdjunit-platform-suite/artifactIdversion1.8.2/versionscopetest/scope/dependencydependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter-params/artifactIdversion5.8.2/versionscopetest/scope/dependencydependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter-engine/artifactIdversion${junit.version}/versionscopetest/scope/dependency 二、Junit框架的使用
2.1Junit有哪些常用注解
2.1.1Test注解 这一个注解作用于方法上面表示这个方法是一个测试用例。当Test注解作用在一个方法上面的时候表示这一个方法是可以直接运行的无需通过main方法来调用。 2.1.2BeforeEach
在执行每一个被Test修饰的方法之前都会执行一次BeforeEach注释的方法。
BeforeEachvoid aaa(){System.out.println(pre);}Testvoid bbb(){System.out.println(bbb);}Testvoid ccc(){System.out.println(ccc);} 每执行一个Test之前就需要执行一次BeforeEach注释的方法
运行类上面的运行按钮 2.1.3BeforeAll 首先被BeforeAll注释的方法一定是静态的。 其次不同于BeforeEach的是BeforeAll注释的方法一定是静态的并且只会在加载外部类的时候执行一次并不会在每一个方法执行之前再次执行了。
public class Test1 {BeforeAllstatic void aaa(){System.out.println(pre);}Testvoid bbb(){System.out.println(bbb);}Testvoid ccc(){System.out.println(ccc);}
} 2.1.4AfterAll
被这个注解修饰的方法也必须是静态的在每一个Test之后进行修饰。
public class Test1 {BeforeAllstatic void aaa(){System.out.println(pre);}Testvoid bbb(){System.out.println(bbb);}Testvoid ccc(){System.out.println(ccc);}AfterAllstatic void afterAll(){System.out.println(end...);}
}
运行结果 2.1.5AfterEach
同理在每一个Test注释的方法执行结束的末尾都会执行一次AfterEach注释的方法。
public class Test1 {BeforeEachvoid aaa(){System.out.println(pre);}Testvoid bbb(){System.out.println(bbb);}Testvoid ccc(){System.out.println(ccc);}AfterEachvoid afterAll(){System.out.println(end...);}
}
运行结果 2.2Junit的断言
写自动化测试结果要么是成功的要么是失败的不存在成功一半的情况。
那么就需要使用到断言:assert断言预期结果和真实结果是否一致。
Assertions.assertEquals(期待值真实值);
当期待值和真实值一致的时候这个断言才不会抛出异常
当期待值和真实值不一致的时候就会抛出异常 代码实现
public class Test2 {FirefoxDriver driver;BeforeEachpublic void get(){drivernew FirefoxDriver();//捕捉到这一个页面driver.get(https://www.baidu.com);}Testpublic void testOne(){//尝试获取百度一下的文本框String textdriver.findElement(By.cssSelector(#su)).getAttribute(value);//使用AssertEquals来进行断言Assertions.assertEquals(百度一下,text);}AfterEachpublic void after(){driver.quit();}
}
如果运行的结果一致那么就提示测试用例通过 2.2.1Assertions.assertNotEquals(百度一下,text)
与Assertions.assertEquals(期待值真实值)相反。
只有不一致的时候测试用例才会通过。 2.2.2Assertions.assertTrue(text.equals(百度一下))
传入的参数应该是一个返回值为boolean类型的表达式
Test
public void assertTrueTest(){String textdriver.findElement(By.cssSelector(#su)).getAttribute(value);//如果返回true那么测试用例通过否则测试用例不通过Assertions.assertTrue(text.equals(百度一下));}
同理还有AssertFalse 2.2.3Assertions.assertNull(a); Testpublic void assertNull(){String anull;Assertions.assertNull(a);}
如果一个引用为null那么默认测试用例通过。
同理还有Assertions.assertNotNull()那么一个引用不为null的时候测试用例才通过。 三、用例的执行顺序
①针对方法的排序
第一步在这个类上面添加注解TestMethodOrder(MethodOrderer.OrderAnnotation.class) 第二步
使用Order(执行顺序)作用在方法上面表示是第几个执行 TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Test2 {FirefoxDriver driver;BeforeEachOrder(1)public void get(){drivernew FirefoxDriver();//捕捉到这一个页面driver.get(https://www.baidu.com);}TestOrder(2)public void testOne(){//尝试获取百度一下的文本框String textdriver.findElement(By.cssSelector(#su)).getAttribute(value);Assertions.assertNotEquals(百度一下,text);}TestOrder(3)public void assertTrueTest(){String textdriver.findElement(By.cssSelector(#su)).getAttribute(value);//如果返回true那么测试用例通过否则测试用例不通过Assertions.assertTrue(text.equals(百度一下));}AfterEachpublic void after(){driver.quit();}
} 为什么需要用到juit的排序功能 如果用例之间存在关联关系存在耦合但是不是绝对有关联关系那么就需要手动指定用例的执行顺序。因为各个测试用例的执行顺序是无序的。 这样就可以避免出现各个测试用例之间执行顺序不正确的情况。 四、测试套件(Suit)
测试套件用于把所有的测试用例都执行起来。
Suite
这一个注解作用于类上面用于执行所有的测试用例。 SelectClasses({待测试的类.class})
这个注解和上面的注解需要配合使用这样才可以一起执行待测试类的测试用例。
当然也可以传递多个.class对象。 Suite
SelectClasses({Test1.class,Test2.class})
public class SuitTest {}运行结果 SelectPackages(包名)
扫描这一个包下面包含了Test注解的方法的类。
Suite
SelectPackages(TestFile)
public class SuitTest {}
但是扫描的包不可以和当前的类在同一个包下面
需要注意的是这种情况下面被扫描的类一定是xxxTest这样命名的否则是扫描不到的。 五、参数化
对于一个测试用例可能会测试传入的参数是多种的情况
例如对于一个文本框进行测试可以测试多种输入的情况
如下图如果为每一个输入的name都定义一个方法那么就显得非常冗余于是就引入了参数化。 5.1ParameterizedTest、ValueSource(strings {})
第一个注解Parameterized作用在方法上面用来表示这个方法支持传入多个参数
第二个注解ValueSource用于指定传入参数的类型例如:strings{}就表示传入的是一个string类型的数组
ints{2345}表示传入的参数是一个int类型的数组
但是同一个ValueSource注解当中只支持一种数据类型。 运行结果 5.2CsvSource(value{第一组数据,第二组数据})
其中每一组数据当中对应方法传入的参数的值。采用,来分割。
ParameterizedTestCsvSource(value {小明,20,小红,30,小李,40})public void printStringAndInteger(String name,int age){System.out.println(name:name;ageage);} 当然一组数据当中的分隔符也不一定采用系统默认的,分割也可以采用自定义的分隔符。
ParameterizedTestCsvSource(value {小明-20,小红-20,小李-40},delimiter -)public void printStringAndAge(String name,int age){System.out.println(name:name;ageage);}
用户自定义的分隔符 如果参数当中包含逗号,就需要使用单引号转义字符串 5.3读取文件参数CsvFileSource(resources/文件名称)
第一步在resources目录下面新建一个文件并且指定名称
第二步在文件当中以逗号的方式分割每一组参数 然后运行程序 5.3.1读取其他磁盘文件的操作指定文件为files... ParameterizedTestCsvFileSource(files E:\\OJSystem\\src\\main\\resources\\my.csv)public void printStringAndAge3(String name,int age){System.out.println(name:name;ageage);} 5.4动态参数(单参数版本)
第一步定义提供数据的方法必须声明为静态返回值为一个Stream对象方法内部调用Stream.of(参数列表)
第二步定义dyNatickTest(String x)方法获取参数并用MethodSource()指定
第三步输出参数。 ParameterizedTestMethodSource(methodDemo)void dyNatickTest(String x){System.out.println(x);}static StreamString methodDemo(){return Stream.of(张三,李四,王五);} 如果MethodSource当中不指定参数的名称那么就会调用跟测试用例同名的静态方法 5.5动态参数(多参数版本) 第一步新建一个测试方法并且指定多个参数。使用ParameterizedTest和MethodSource注解同时作用 第二步新建一个和测试用例同名的静态方法 第三步在静态方法当中调用Stream.of()方法并且传入的参数为多个Arguments.arguments(第一步创建方法的参数列表) 代码实现
ParameterizedTestMethodSourcevoid paramsTest(String name,int age){System.out.println(name:name;age :age);}/*** 多参数的版本* Stream对象return*/static StreamArguments paramsTest(){return Stream.of(Arguments.arguments(lucy,29),Arguments.arguments(lili,30),Arguments.arguments(lisi,40));} 六、对于重要测试场景的截图
第一步定位到需要的页面
第二步调用getSrceenshotAs方法传入的擦参数是OutputTpye.FILE
第三步新建一个File类指定路径
第四步调用copyFile方法把生成的文件放到指定的目录当中
Testpublic void screenShortTest() throws IOException, InterruptedException {//百度搜索关键字driver.findElement(By.cssSelector(#kw)).sendKeys(selenium);driver.findElement(By.cssSelector(#su)).click();//屏幕截图把截图的文件存放到指定的位置//以文件的形式存储File srcFiledriver.getScreenshotAs(OutputType.FILE);//把截图的文件存放到指定的目录下面File destFilenew File(E:/OJSystem/src/test/Files/img.png);Thread.sleep(1000);FileUtils.copyFile(srcFile,destFile);}