当前位置: 首页 > news >正文

中国建设银行官网首页 网站昆山那个网站推广好

中国建设银行官网首页 网站,昆山那个网站推广好,游戏类网站欣赏,html的网页代码文章目录Selenium环境部署自动化测试例子常见的元素操作窗口等待浏览器的操作弹窗选择器执行脚本文件上传浏览器参数Junit 5导入依赖Junit 4 和 Junit5 注解对比断言测试顺序参数化单参数多参数动态参数测试套件指定类来运行测试用例指定包名来运行包下测试用例Selenium 为什么… 文章目录Selenium环境部署自动化测试例子常见的元素操作窗口等待浏览器的操作弹窗选择器执行脚本文件上传浏览器参数Junit 5导入依赖Junit 4 和 Junit5 注解对比断言测试顺序参数化单参数多参数动态参数测试套件指定类来运行测试用例指定包名来运行包下测试用例Selenium 为什么选择selenium作为我们的web自动化测试工具 开源免费支持多浏览器支持多系统支持多语言【JavaPythonC#RubbyJavaScriptKolin】selenium包提供了很多可供测试使用的API 环境部署 Chrome浏览器 Chrome驱动【驱动器版本要和浏览器版本对应越详细越好】 然后把驱动包放在安装jdk的bin目录下 selenium工具包 自动化测试例子 分为接口自动化测试和UI自动化测试 UI自动化测试包含界面测试 我们都知道用户的设备很多有手机平板和电脑。这些设备运行的项目在发布之初都需要经过测试这些测试又分为web自动化测试 和 移动端自动化测试。这里以 web自动化测试 为主。 自动化测试的工具有很多比如 QTP、SeleniumJmeter、Loadrunner。本期就以 Selenium 为主进行介绍最简单的自动化测试 测试点击百度 import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeDriver;private class AutoTest {// 模拟百度搜索关键词public static void baiduSearchKey() {String url https://www.baidu.com;String keyWords 新闻;ChromeDriver chromeDrivernew ChromeDriver();try {Thread.sleep(5000);// 输入框输入文字chromeDriver.findElement(new By.ByXPath(//*[id\kw\])).sendKeys(keyWords);Thread.sleep(5000);// 点击搜索按钮chromeDriver.findElement(new By.ByXPath(//*[id\su\])).click();Thread.sleep(5000);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit();}public static void main(String[] args) {baiduSearchKey();} } 获取元素方法有很多但经常用的是 ByXPath和ByCssSelector ByXpath /相当于子级一层一层的完整xpath路径 //相当于越级直接越过之前的html标签根据id来查询标签 后文中只有之前的几个操作时获取部分xpath以后的获取都是完整的获取xpath路径【看//数量即可知道是否根据带通配符或者id查询来区别】 常见的元素操作 输入文本 sendKeys(str) 对元素操作的前提是元素能够被找到如果查询的元素不是可编辑的文本标签那么前端不受影响后端也不报错。按照程序的设定正常退出点击操作 click()提交操作 submit() private static void TestBlogLogin() {// 输入邮箱String url http://localhost:8080/index.html;String email 1969612859qq.com;String password admin;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.get(url);try {Thread.sleep(3000);// 输入邮箱chromeDriver.findElement(new By.ByXPath(//*[id\login\]/div[1]/input)).sendKeys(email);Thread.sleep(3000);// 输入密码chromeDriver.findElement(new By.ByXPath(//*[id\login\]/div[2]/input)).sendKeys(password);Thread.sleep(3000);// 点击登录【也可以回车登录】chromeDriver.findElement(new By.ByXPath(/html/body/div/div/div/form[1]/button)).click();//chromeDriver.findElement(new By.ByXPath(/html/body/div/div/div/form[1]/button)).submit();Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }提交操作 submit 仅适用于form表单之类的submit操作一般用的少 Selenium更推荐使用 click 功能比 submit 更丰富 清除操作 clear() private static void TestBlogLogin() {// 输入正确的邮箱和密码String url http://localhost:8080/index.html;String email 1969612859qq.com;String password admin;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.get(url);try {Thread.sleep(3000);chromeDriver.findElement(new By.ByXPath(//*[id\login\]/div[1]/input)).sendKeys(手滑输入错了);Thread.sleep(3000);// 清除文本chromeDriver.findElement(new By.ByXPath(//*[id\login\]/div[1]/input)).clear();Thread.sleep(3000);chromeDriver.findElement(new By.ByXPath(//*[id\login\]/div[1]/input)).sendKeys(email);Thread.sleep(3000);chromeDriver.findElement(new By.ByXPath(//*[id\login\]/div[2]/input)).sendKeys(password);Thread.sleep(3000);chromeDriver.findElement(new By.ByXPath(/html/body/div/div/div/form[1]/button)).click();Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }获取文本值 getText() private static void TestBlogLogin() {// 输入正确的邮箱和密码String url http://localhost:8080/index.html;String email 1969612859qq.com;String password admin;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.get(url);try {// 获取第一道题目的标题String text chromeDriver.findElement(new By.ByXPath(/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[2])).getText();System.out.println(getText()获取到的文本 text);Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }发现即使 URL 跳转到了别的网页由于线程休眠3s的缘故并不会很快就去获取页面元素而是给了页面一个加载的时间因此可以完全获取到跳转到其它页面的标签 获取属性 getAttribute(attr) private static void TestBlogLogin() {// 输入正确的邮箱和密码String url http://localhost:8080/index.html;String email 1969612859qq.com;String password admin;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.get(url);try {// 获取属性String role chromeDriver.findElement(new By.ByXPath(/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/div)).getAttribute(role);Thread.sleep(3000);String aria_valuenow chromeDriver.findElement(new By.ByXPath(/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/div)).getAttribute(aria-valuenow);Thread.sleep(3000);String aria_valuemin chromeDriver.findElement(new By.ByXPath(/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/div)).getAttribute(aria-valuemin);Thread.sleep(3000);String aClass chromeDriver.findElement(new By.ByXPath(/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/div)).getAttribute(class);Thread.sleep(3000);String style chromeDriver.findElement(new By.ByXPath(/html/body/div/div/div[2]/div/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/div)).getAttribute(style);Thread.sleep(3000);System.out.printf(role%s\naria_valuenow%s\naria_valuemin%s\naClass%s\nstyle%s\n, role, aria_valuenow, aria_valuemin, aClass, style);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }6. 获取标题getTitle()和urlgetCurrenturl() // 模拟百度搜索关键词 private static void baiduSearchKey() {String url https://www.baidu.com;String keyWords 新闻;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.get(url);HashMapString, ListString info new HashMap();try {Thread.sleep(5000);ArrayListString before new ArrayListString() {{add(chromeDriver.getTitle());add(chromeDriver.getCurrentUrl());}};// 输入框输入文字chromeDriver.findElement(new By.ByXPath(//*[id\kw\])).sendKeys(keyWords);Thread.sleep(5000);// 点击搜索按钮chromeDriver.findElement(new By.ByXPath(//*[id\su\])).click();Thread.sleep(5000);System.out.println(搜索之后);ArrayListString after new ArrayListString() {{add(chromeDriver.getTitle());add(chromeDriver.getCurrentUrl());}};info.put(before, before);info.put(after, after);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit();System.out.println(info); }窗口 窗口大小 窗口大小的设置最大/小化全屏窗口手动设置窗口大小 private static void windControl() {String url https://www.baidu.com;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.get(url);try {Thread.sleep(1500);// 窗口最大化chromeDriver.manage().window().maximize();Thread.sleep(1500);// 窗口最小化chromeDriver.manage().window().minimize();Thread.sleep(1500);// 全屏chromeDriver.manage().window().fullscreen();Thread.sleep(1500);// 手动设置窗口大小chromeDriver.manage().window().setSize(new Dimension(1024, 768));Thread.sleep(1500);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }切换窗口 一般的窗口切换可能会导致找不到元素的BUG private static void windControl() {String url https://www.baidu.com;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.get(url);try {Thread.sleep(1500);// 点击准备跳转chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[3]/a[6])).click();String value chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[3]/div/div/div/div/div/div[2]/form/span[2]/input)).getAttribute(value);System.out.println(value);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }由于无法获取跳转页面的元素所以就会报错。因此需要一个页面切换功能 private static void windControl() {String url https://www.baidu.com;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.get(url);try {Thread.sleep(1500);// 获取当前页面句柄String currentHandle chromeDriver.getWindowHandles().toString();System.out.println(当前首页句柄currentHandle);Thread.sleep(1500);// 点击准备跳转chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[3]/a[6])).click();// 获取跳转之后所有标签页的句柄SetString handles chromeDriver.getWindowHandles();for (String handle : handles) {if (currentHandle ! handle){chromeDriver.switchTo().window(handle);}}String value chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[3]/div/div/div/div/div/div[2]/form/span[2]/input)).getAttribute(value);System.out.println(value);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }运行的退出码已经恢复正常 3. 屏幕截图 需要导入一个常用的commons-io库 dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.6/version /dependencyprivate static void windControl() {String url https://www.baidu.com;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.get(url);try {Thread.sleep(1500);// 点击准备跳转chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[3]/a[6])).click();File screenshotAs chromeDriver.getScreenshotAs(OutputType.FILE);// 把屏幕截图好的文件放在指定的路径下String fileName my.png;try {FileUtils.copyFile(screenshotAs, new File(fileName));} catch (IOException e) {throw new RuntimeException(e);}String value chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[3]/div/div/div/div/div/div[2]/form/span[2]/input)).getAttribute(value);System.out.println(value);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }这里会发生报错由于屏幕截图原因。所以会保存当时的获取状态。 会把当前的现场截图保存下来【由于没有切换页面所以也就会报错截图代码发生在报错之前的代码所以也就保留了事故现场】 等待 程序执行的速度比页面渲染速度快很多因此之前的等待都是使用线程的强制等待这并不合理。等待一共分为四种。 强制等待、隐式等待、显示等待、流畅等待 强制等待 程序阻塞运行Thread.sleep()。会用到但是自动化里不能用的特别多否则拖慢速度隐式等待 隐式等待会一直轮询判断元素是否存在如果不存在就等待设置好的时间里不断地进行轮询知道元素能够被找到 private static void waitController(){String url https://www.baidu.com;ChromeDriver chromeDrivernew ChromeDriver();// 添加隐式等待会作用于chromeDriver整个生命周期chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));chromeDriver.get(url);chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input)).sendKeys(迪丽热巴);chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input)).click();chromeDriver.findElement(new By.ByXPath(/html/body/div[2]/div[3]/div[1]/div[3]/div[1]/div[1]/div/div/div/div/div[2]/div/a/div/p/span/span));chromeDriver.quit(); }显示等待 隐式等待针对的是 driver的整个生命周期所以对全部元素有效但有时候并非全部都需要等待我们可以只针对其中一个元素进行等待操作其余元素交给程序快速运行进而提高自动化测试的效率 private static void webDriverWait() {String url https://www.baidu.com;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.get(url);chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input)).sendKeys(迪丽热巴);chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input)).click();// 只针对某个元素显示等待new WebDriverWait(chromeDriver, Duration.ofSeconds(3)).until(lambda - chromeDriver.findElement(new By.ByXPath(/html/body/div[2]/div[3]/div[1]/div[3]/div[1]/div[1]/div/div/div/div/div[2]/div/a/div/p/span/span)));chromeDriver.get(url); }这里使用了 lambda表达式 的语法我们查看一下 until的源码 参数是一个泛型所以可以传入任何泛型函数。然后就是执行的循环获取页面元素操作。 隐式等待 和 显式等待 并不能同时使用可能会出现意想不到的结果隐式等待 和 显示等待 均不出现效果的时候可以使用 强制等待 浏览器的操作 浏览器的回退前进和刷新操作 private static void navigateControl() {String url https://www.baidu.com;ChromeDriver chromeDriver new ChromeDriver();// 简写 // chromeDriver.get(url);// 非简写chromeDriver.navigate().to(url);chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));// 想要回退到访问百度网址之前的状态chromeDriver.navigate().back();// 前进有进入到了百度首页chromeDriver.navigate().forward();// 刷新百度首页chromeDriver.navigate().refresh();chromeDriver.quit(); }弹窗 弹窗一共有3大类型如下所示分别为alert、confirm和prompt 但是却发现浏览器进入检查时候无法获取到弹窗的元素 处理弹窗的步骤 将driver对象作用到弹窗上切换到弹窗选择确认/取消提示弹窗输入文本 作用到弹窗上driver.switchTo.alert() 确认driver.accept() 取消driver.dismiss() 输入driver.sendKeys() 前端代码 div idalertVuebutton v-on:clickf(){{value}}/button /div div idconfirmVuebutton v-on:clickf(){{value}}/button /div div idpromptVuebutton v-on:clickf(){{value}}/button /divscript typetext/javascript srcvue.js/script scriptconst alertVue new Vue({el: #alertVue,data: {value: Alert弹窗,},methods: {f() {window.alert(alert弹窗);}}});const confirmVue new Vue({el: #confirmVue,data: {value: Confirm确认框,},methods: {f() {if (window.confirm(是否确认)) {confirmVue.value true;} else {confirmVue.value false;}}}});const promptVue new Vue({el: #promptVue,data: {value: 输入框,},methods: {f() {promptVue.value window.prompt(输入框);}}}); /script测试代码 private static void alertController(){String url file:///D:/Documents/Program/Java/SeleniumTest/Autotest/src/test/java/alertHTML.html;ChromeDriver chromeDrivernew ChromeDriver();chromeDriver.navigate().to(url);try {Thread.sleep(1500);// 点击 alertchromeDriver.findElement(new By.ByXPath(/html/body/div[1]/button)).click();Thread.sleep(1500);// 切换到弹窗Alert alert chromeDriver.switchTo().alert();// 确认操作:accept/取消操作:dismissalert.dismiss();Thread.sleep(1500);// 点击 confirmchromeDriver.findElement(new By.ByXPath(/html/body/div[2]/button)).click();Thread.sleep(1500);// 切换到弹窗alert chromeDriver.switchTo().alert();// 确认操作alert.accept();Thread.sleep(1500);// 点击 promptchromeDriver.findElement(new By.ByXPath(/html/body/div[3]/button)).click();Thread.sleep(1500);// 切换到弹窗alert chromeDriver.switchTo().alert();Thread.sleep(1500);// 在页面上看不到输入的文本效果但是其实已经输入了alert.sendKeys(阿斯顿马丁);// 接受文本alert.accept();Thread.sleep(1500);// 确认操作} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }prompt 弹窗进行 sendKeys(str) 的时候不会在页面出现效果但是程序已经输入有文本信息alert 警告弹窗虽然只有确认选项但是也可以用 dismiss和accept 都可以进行取消操作url 一定要复制浏览器中选择而不是从资源路径中选择【浏览器的url前边会多一个file:///】 选择器 选择框的处理困难在于无法将下拉框的元素进行定位每当点击检查的时候下拉框就会消失 这个时候我们可以根据三个条件进行选择 文本属性下标 html代码 div idselectVueselectoption v-for(month, index) in monthes v-bind:valueindex1{{month}}/option/select /divscript const selectVue new Vue({el: #selectVue,data: {monthes: [January, February, March, April, May, June, July, August, September, October, November, December,],}, }); /scriptJava代码 private static void alertController() {String url file:///D:/Documents/Program/Java/SeleniumTest/Autotest/src/test/java/alertHTML.html;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.navigate().to(url);try {// option选择器WebElement element chromeDriver.findElement(new By.ByXPath(/html/body/div[4]/select));Thread.sleep(1500);// 先创建选择框对象Select select new Select(element);Thread.sleep(1500);// 根据文本来选择【并不会像正常操作一样点击一下选择框而是直接选中下拉框】select.selectByVisibleText(September);Thread.sleep(1500);// 根据属性值选择select.selectByValue(1);Thread.sleep(1500);// 根据下标选择【0开始】选取九月select.selectByIndex(8);Thread.sleep(1500);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }XPath的选择器是从1开始而下标选择从0开始 执行脚本 执行 js 代码有时候会遇到输入文本不完全或者不生效的情况下可以使用执行原生js脚本进行解决 private static void scriptControl(){String url https://image.baidu.com/;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.navigate().to(url);try {// 执行 js 代码让页面置底chromeDriver.executeScript(document.documentElement.scrollTop 500);Thread.sleep(1500);// 执行 js 代码让页面置顶chromeDriver.executeScript(document.documentElement.scrollTop 0);Thread.sleep(1500);// 百度输入框输入指定文本chromeDriver.navigate().to(https://www.baidu.com/);chromeDriver.executeScript(var ssdocument.querySelector(#kw); ss.value英雄钢笔);Thread.sleep(1500);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }文件上传 文件上传的难点在于当点击上传文件时的弹窗是系统自己的弹窗并不是浏览器的弹窗。对于Selenium而言并不能控制系统。 private static void fileUploadControl(){String url file:///D:/Documents/Program/Java/SeleniumTest/Autotest/src/test/java/alertHTML.html;ChromeDriver chromeDriver new ChromeDriver();chromeDriver.navigate().to(url);try {Thread.sleep(1500);chromeDriver.findElement(new By.ByXPath(/html/body/div[5]/input)).sendKeys(D:\\Documents\\Program\\Java\\SeleniumTest\\Autotest\\src\\test\\java\\alertHTML.html);Thread.sleep(1500);} catch (InterruptedException e) {throw new RuntimeException(e);}chromeDriver.quit(); }这里运行完毕之后并不是把文件上传到服务器而是要把上传的文件路径文件以名称的方式放到这里 浏览器参数 实际工作中测试人员将自动化部署在机器上自动的执行测试人员不会每次都一直盯着自动化执行的过程而是直接查看自动化执行的结果。 无头模式类似于Linux的模式运行命令挂载在后台进程不在前台显示。浏览器而言的话就是没有画面的运行一些自动化测试脚本这样可以节约一定的机器内存资源。 private static void paramControl() {// 百度搜索 ”测试开发工程师“// 先创建选项对象然后设置浏览器参数String url https://www.baidu.com/;ChromeOptions chromeOptions new ChromeOptions();chromeOptions.addArguments(-headless);// 添加浏览器参数设置ChromeDriver chromeDriver new ChromeDriver(chromeOptions);chromeDriver.navigate().to(url);chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input)).sendKeys(测试开发工程师);chromeDriver.findElement(new By.ByXPath(/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input)).click();chromeDriver.quit(); }Junit 5 自动化是Selenium脚本来实现的Junit是java的单元测试工具.只不过我们在实现自动化的时候需要借用Junit库里面提供的一些方法 Junit 5支持最低支持jdk8 目前Java领域内最为流行的单元测试框架 ------ JUnit Junit 5 Junit Platform Junit Jupiter Junit Vintage Junit Platform: Junit Platform是在JVM上启动测试框架的基础不仅支持Junit自制的测试引擎其他测试引擎也都可以接入 Junit Jupiter: Junit Jupiter提供了JUnit5的新的编程模型是JUnit5新特性的核心。内部 包含了一个测试引擎用于在Junit Platform上运行 Junit Vintage: 由于JUnit已经发展多年为了照顾老的项目JUnit Vintage提供了兼容JUnit4.x,Junit3.x的测试引擎 导入依赖 !-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -- dependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter/artifactIdversion5.9.2/versionscopetest/scope /dependency !-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -- dependencygroupIdorg.junit.platform/groupIdartifactIdjunit-platform-suite/artifactIdversion1.9.2/versionscopetest/scope /dependencyJunit 4 和 Junit5 注解对比 Junit 5Junit 4说明TestTest被注解的是一个测试方法和Junit 4相同BeforeAllBeforeClass被注解的静态方法将在当前类中的所有Test方法前执行一次BeforeEachBefore被注解的方法将在当前类中的么欸个Test方法前执行AffterAllAfterClass被注解的静态方法将在当前类中的所有Test方法后执行一次AffterEachAfter被注解的方法将在当前类中的么欸个Test方法后执行DIsableIgnore被注解的方法不会执行将被跳过但会报告为已执行 Junit 4 中Test 是 org.junit.Test; Junit 5 中Test 是 org.junit.jupiter.api.Test; BeforeAll 注解必须用在 static 修饰的代码块上否则会报错 import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test;public class JunitTest {// 当前方法要在所有测试用例之前执行一次BeforeAllstatic void beforeAll() {System.out.println(BeforeAll);}// 当前方法要在每个测试用例执行之前执行一次BeforeEachvoid beforeEach() {System.out.println(BeforeEach);}Testvoid t1() {System.out.println(Test1);}Testvoid t2() {System.out.println(Test2);}Testvoid t3() {System.out.println(Test3);} } After效果和Before效果相反 import org.junit.jupiter.api.*;public class JunitTest {// 当前方法要在所有测试用例之前执行一次BeforeAllstatic void beforeAll() {System.out.println(BeforeAll);}// 当前方法要在每个测试用例执行之前执行一次BeforeEachvoid beforeEach() {System.out.println(BeforeEach);}Testvoid t1() {System.out.println(Test1);}Testvoid t2() {System.out.println(Test2);}Testvoid t3() {System.out.println(Test3);}AfterEachvoid afterEach() {System.out.println(AfterEach);}AfterAllstatic void afterAll() {System.out.println(AfterAll);} } 断言 断言方法说明assertEquals(expected, actual)如果 expected 不等于 actual 则断言失败assertFalse(booleanExpression)如果 booleanExpression 不是 false 则断言失败assertNull(actual)如果 actual 不是 null 则断言失败assertNotNull(actual)如果 actual 是 null 则断言失败assertTrue(booleanExpression)如果 booleanExpression 不是 true 则断言失败 Test void testAttributeValue() {String url https://www.baidu.com/;ChromeOptions chromeOptions new ChromeOptions();chromeOptions.addArguments(-headless);ChromeDriver chromeDriver new ChromeDriver(chromeOptions);chromeDriver.navigate().to(url);chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));String value chromeDriver.findElement(By.cssSelector(#su)).getAttribute(value);// 假如这里获取到的属性值不是 百度一下 而是百度两下System.out.println(value: value);Assertions.assertEquals(百度两下, value);chromeDriver.quit(); }断言失败 断言成功 Test void testAttributeValue() {String url https://www.baidu.com/;ChromeOptions chromeOptions new ChromeOptions();chromeOptions.addArguments(-headless);ChromeDriver chromeDriver new ChromeDriver(chromeOptions);chromeDriver.navigate().to(url);chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));String value chromeDriver.findElement(By.cssSelector(#su)).getAttribute(value);// 假如这里获取到的属性值不是 百度一下 而是百度两下System.out.println(value: value);Assertions.assertNotEquals(百度两下, value);chromeDriver.quit(); }不会提示错误地方 测试顺序 import org.junit.jupiter.api.*;public class JunitTest {// 当前方法要在所有测试用例之前执行一次BeforeAllstatic void beforeAll() {System.out.println(BeforeAll);}// 当前方法要在每个测试用例执行之前执行一次BeforeEachvoid beforeEach() {System.out.println(BeforeEach);}Testvoid ae() {System.out.println(Test1);}Testvoid bc() {System.out.println(Test2);}Testvoid ab() {System.out.println(Test3);}AfterEachvoid afterEach() {System.out.println(AfterEach);}AfterAllstatic void afterAll() {System.out.println(AfterAll);} }BeforeAll BeforeEach Test3 AfterEach BeforeEach Test1 AfterEach BeforeEach Test2 AfterEach AfterAll发现执行顺序按照方法名排序一样这里的顺序并不是按照程序中代码的顺序执行。有时候我们需要按照顺序执行代码比如测试系统的时候必须要用户先登陆才可以后续的一些操作的时候就需要按照顺序执行测试代码 添加一个 TestMethodOrder 注解然后添加参数 MethodOrderer.OrderAnnotation.class最后再给每个执行的代码编辑顺序即可 import org.junit.jupiter.api.*;TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class JunitTest {// 当前方法要在所有测试用例之前执行一次BeforeAllstatic void beforeAll() {System.out.println(BeforeAll);}// 当前方法要在每个测试用例执行之前执行一次BeforeEachvoid beforeEach() {System.out.println(BeforeEach);}TestOrder(1)void ae() {System.out.println(Test1);}TestOrder(2)void bc() {System.out.println(Test2);}TestOrder(3)void ab() {System.out.println(Test3);}AfterEachvoid afterEach() {System.out.println(AfterEach);}AfterAllstatic void afterAll() {System.out.println(AfterAll);} } BeforeAll BeforeEach Test1 AfterEach BeforeEach Test2 AfterEach BeforeEach Test3 AfterEach AfterAll参数化 尽可能地通过一个用例多组参数来模拟用户的行为使用了参数化注解之后就不能再使用 Test 注解 单参数 ParameterizedTest// 使用参数化注解之前需要先声明该方法为参数化方法 ValueSource(strings {1969612859qq.com, 1969612858qq.com})// 通过注解提供数据源 void SingleParamsTest(String email){System.out.println(email); }可以看到 ValueSource(数据类型{参数1, 参数2, 参数3...}) 提供的数据源类型有很多 多参数 ParameterizedTest CsvSource({1969612859qq.com, admin, 1969612858qq.com, root}) void muchParamsTest(String email, String password){System.out.printf(email:%spassword:%s\n, email, password); }email:1969612859qq.compassword:admin email:1969612858qq.compassword:root当参数很多的时候我们可以把参数放入文件中然后通过文件读取获取参数 ParameterizedTest CsvFileSource(files D:\\Documents\\Program\\Java\\SeleniumTest\\Autotest\\src\\test\\resources\\userData.csv) void csvFileParamsTest(String email, String password){System.out.printf(email:%spassword:%s\n, email, password); }发现 CsvFileSource 的源码可以放入很多参数来设置文件这里只放了 files 一个参数的值文件默认编码已经是 UTF-8 所以就可以不用管编码问题 动态参数 这里导入一个随机工具类 common-util–使用方法 // 动态参数 static StreamArguments methodParams(){// 构造动态参数String[] arr new String[10];for (int i 0; i arr.length; i) {arr[i] RandomUtil.randomNumbers(10)qq.com;}return Stream.of(Arguments.arguments(arr[0], RandomUtil.randomString(8)),Arguments.arguments(arr[1], RandomUtil.randomString(8)),Arguments.arguments(arr[2], RandomUtil.randomString(8)),Arguments.arguments(arr[3], RandomUtil.randomString(8)),Arguments.arguments(arr[4], RandomUtil.randomString(8)),Arguments.arguments(arr[5], RandomUtil.randomString(8)),Arguments.arguments(arr[6], RandomUtil.randomString(8)),Arguments.arguments(arr[7], RandomUtil.randomString(8)),Arguments.arguments(arr[8], RandomUtil.randomString(8)),Arguments.arguments(arr[9], RandomUtil.randomString(8))); } ParameterizedTest MethodSource(value methodParams) void dynamicMethodParams(String email, String password){System.out.printf(email:%spassword:%s\n, email, password); } email:0150592006qq.compassword:5knqh9nd email:6506175266qq.compassword:jndm1vx6 email:4815105218qq.compassword:9e6yaky2 email:5072613647qq.compassword:56vjv9ff email:1471676761qq.compassword:0uq2mx9r email:0637284991qq.compassword:k5xcauzb email:8646939279qq.compassword:q9zltwfd email:7903224405qq.compassword:wrgn7fxr email:2771169159qq.compassword:f3l255bc email:8080867273qq.compassword:mnpveuxj这里为了方便就直接使用 Arguments 来替代 小技巧 如果数据源与测试方法同名则无需执行数据源是来自哪里的 // 动态参数 static StreamArguments dynamicMethodParams(){// 构造动态参数String[] arr new String[10];for (int i 0; i arr.length; i) {arr[i] RandomUtil.randomNumbers(10)qq.com;}return Stream.of(Arguments.arguments(arr[0], RandomUtil.randomString(8)),Arguments.arguments(arr[1], RandomUtil.randomString(8)),Arguments.arguments(arr[2], RandomUtil.randomString(8)),Arguments.arguments(arr[3], RandomUtil.randomString(8)),Arguments.arguments(arr[4], RandomUtil.randomString(8)),Arguments.arguments(arr[5], RandomUtil.randomString(8)),Arguments.arguments(arr[6], RandomUtil.randomString(8)),Arguments.arguments(arr[7], RandomUtil.randomString(8)),Arguments.arguments(arr[8], RandomUtil.randomString(8)),Arguments.arguments(arr[9], RandomUtil.randomString(8))); } ParameterizedTest MethodSource// 自动寻找与方法名同名的数据源 void dynamicMethodParams(String email, String password){System.out.printf(email:%spassword:%s\n, email, password); } email:7264428849qq.compassword:wewp75wh email:4884099760qq.compassword:q57n49kf email:2779525807qq.compassword:dkyfns0t email:7260421546qq.compassword:kfxow9gw email:9750978471qq.compassword:a5dwh5g4 email:7595861999qq.compassword:g9gszroo email:5860224630qq.compassword:er521mby email:7009711558qq.compassword:qhftn0rh email:9374899761qq.compassword:zsjkkyns email:6637232897qq.compassword:fu8g79om测试套件 指定类来运行测试用例 package TestSuite;import org.junit.platform.suite.api.SelectClasses; import org.junit.platform.suite.api.Suite;// 测试套件通过 Suite 注解 Suite SelectClasses(value {aaa.class, bbb.class}) public class runSuite { } 测试套件测试 aaa.java, bbb.java, ccc.java 的测试结果类下想要运行的用例必须要被 Test 注解修饰 Suite 注解标识该类是测试套件类而不是测试类 SelectClasses 部分源码告知我们需要填上 class 类名 指定包名来运行包下测试用例 package TestSuite;import org.junit.platform.suite.api.SelectClasses; import org.junit.platform.suite.api.SelectPackages; import org.junit.platform.suite.api.Suite;// 测试套件通过 Suite 注解 Suite //SelectClasses(value {aaa.class, bbb.class}) SelectPackages(TestSuite) public class runSuite { } 发现连 ccc.java 的测试也打印输出了 最好是把要测试的文件以 xxxTest 结尾比较好但是因为文件夹是 TestSuite的缘故所以现在即使不是 xxxTest 结尾的包文件也能被扫描到并执行 Test 注解的方法否则就会执行报错。 报错问题如下所示 解决方案如下所示
http://www.sczhlp.com/news/244883/

相关文章:

  • 无锡自助建站软件婚庆策划公司简介
  • 对二次网站开发的认识运城做网站要多少钱
  • 站内搜索工具网站开发人员的岗位职责
  • 深圳建设银行分行网站德邦公司网站建设特点
  • 毕业设计做网站哪种好邯郸网络运营中心电话号码
  • 长春做网站wang网站结构与导航设计
  • 深圳做棋牌网站建设ios开发课程
  • 手表特卖网站做网站后端语言用什么
  • 建设网站后如何做后台访问国外网站用什么dns
  • 订餐网站系统建设方案用什么语言能写网站吗
  • 网站怎么做自营销网易企业邮箱和网易邮箱的区别
  • 网站建设的语言江苏省品牌专业群建设专题网站
  • 构建网站无障碍建设wordpress 移动端 主题
  • 网站设计的内容建设银行车主卡网上交罚款网站
  • 网站广告代码检测各网站提交入口
  • 做网站前需要准备什么软件纳税服务平台
  • 项目管理网站开发我想给网站网站做代理
  • 如何提高网站的排名网站建设ppt
  • 专业企业网站建设定制WordPress点击头像
  • c2c网站建设系统成都附近旅游景区哪里好玩
  • 网站服务运营队伍与渠道建设网站 图片水印
  • 昆明网站建设方案外包建设电动车官网
  • 外贸平台哪个网站最好知乎wordpress 让导航悬浮
  • 受欢迎的邯郸网站建设企业网站定制设计公司
  • 标志在线设计网站网络优化分为
  • 欢迎访问中国建设银行官方网站能够做代理的网站有哪些问题
  • wap网站微信一键登录怎么做网站主页
  • Sequence2Sequence - -一叶知秋
  • mysql和java获取经纬度的距离的两种方式
  • 重塑生产力:天翼云全球首发RaaS,开启“机器人即服务”商业时代!