开源测试框架期末复习

第一章:基础概念

软件测试分类
根据项目流程阶段划分软件测试:单元测试、集成测试、系统测试、验收测试

软件测试工作中对软件代码的可见程度:白盒测试与黑盒测试

软件的不同测试面:功能测试与性能测试

软件测试工作的自动化程度:手工测试与自动化测试
自动化测试优缺点:重点
  • 缩短软件开发测试周期,可以让产品更快投放市场。
  • 测试效率高,充分利用硬件资源。
  • 节省人力资源,降低测试成本。
  • 增强测试的稳定性和可靠性。提高软件测试的准确度和精确度,增加软件信任度。
  • 软件测试工具使测试工作相对比较容易,但能产生更高质量的测试结果。
  • 软件测试实行自动化进程,绝不是因为厌烦了重复的测试工作,而是因为测试工作的需要,更准确地说是回归测试和系统测试的需要。
自动化测试适合的场景:重点
  • 任务测试明确,需求不会频繁变动。
  • 软件维护周期长,资源丰富。
  • 脚本重复利用率高。
自动化测试流程:重点

需求分析、自动化测试计划、自动化测试脚本编写、测试执行、测试总结。

单元测试自动化,接口测试自动化:

接口测试大体分为两类:模块接口测试和Web接口测试。单元测试更强调的是程序的最小可测试单元 ,而模块测试更强调被测程序功能的完整性 。Web接口测试又可分为两类:服务器接口测试 和外部接口测试。

selenium三/四组件:
// Selenium-RC 可以省略
Selenium-IDE
Selenium-WebDriver
Selenium-Grid

第三章:WebDriver基本使用

打开浏览器:重点
// 火狐浏览器
System.setProperty("webdriver.gecko.driver", "D:\\demo\\geckodriver.exe");
// 如果启动ff浏览器失败:用System的setProperty()方法指定浏览器的路径
//System.setProperty("webdriver.firefox.bin","D:\\ProgramFiles\\MozillaFirefox\\firefox.exe");
WebDriver driver = new FirefoxDriver();

// 谷歌浏览器
System.setProperty("webdriver.chrome.driver", "D:\\demo\\chromedriver.exe");
WebDriver driver = new ChromeDriver();

// IE浏览器
System.setProperty("webdriver.ie.driver", "D:\\demo\\IEDriverServer.exe");  
WebDriver driver = new InternetExplorerDriver ();
关闭浏览器:重点
driver.close(); // 只是关闭当前页面,不会geckodriver的进程
driver.quit(); // 彻底关闭浏览器,geckodriver的进程关闭,释放资源,一般使用quit
访问网页:重点
driver.get(""); // 访问网页一般直接get
driver.navigate().to("");
driver.navigate().back(); // 返回上一次访问的网页
driver.navigate().forward(); // 前进
driver.navigate().refresh(); // 刷新
浏览器尺寸控制
// 设置浏览器大小
Dimension size = new Dimension (300,400);
driver.manage().window().setSize(size);

// 浏览器最大化	
driver.manage().window().maximize(); // 一般常用这个
获取页面信息
String title = driver.getTitle(); // 获取title
String current = driver.getCurrentUrl(); // 获取url
String htmlsrc = driver.getPageSource(); // 获取网页html
自定义profile

了解自定义profile是干什么的就可以。自定义profile就相当于给Firefox换了新用户,新创建的profile不带有原先的用户配置用户数据,相当于一个崭新的浏览器。一般专门新建一个profile用于测试。

元素定位:重点

8种页面元素定位方式必须掌握。常用的有id、name、linkText、xpath,其中xpath是重中之重。

定位方法 实例
ID driver.findElement(By.id(“id值”))
name driver.findElement(By.name(“name值”))
链接的全部文字 driver.findElement(By.linkText(“linkText”))
部分链接文字 driver.findElement(By.partialLinkText(“部分linkText值”))
xpath方式 driver.findElement(By.xpath(“xpath 值”))
CSS driver.findElement(By.cssSelector(“css定位表达式”))
Class名称 driver.findElement(By.className(“class属性值”))
标签名称 driver.findElement(By.tagName(“标签名称”))

具体可以看我的博客链接:https://blog.csdn.net/weixin_43237362/article/details/104540558

第四章:WebDriver基础应用

常见的控件操作:重点

输入框 input

WebElement input = driver.findElement(By.id("name"));
input.clear(); // 清空
input.sendKeys("hello"); // 填入
input.getText(); // 获取已存在的文字
input.submit(); // 提交input

按钮 button

WebElement button = driver.findElement(By.id("button"));
button.click();

下拉单选框 select

WebElement element = driver.findElement(By.id("select"));
Select select = new Select(element);
select.selectByIndext(0); // 第一个下拉按钮
select.selectByValue("HB"); // html中option的value属性
select.selectByVisableText("河北"); // 网页中下拉可见的选项
select.getFirstSelectedOption.getText(); // 获取第一个选中的内容

下拉多选框 select

WebElement element = driver.findElement(By.id("select"));
Select select = new Select(element);
// 多选框可以多次同时选中
select.selectByIndext(0); 
select.selectByIndext(1); 
select.deselectAll(); //取消所有的选中项

单选框 radioBox

WebElement radio = driver.findElement(By.id("radioBox"));
radio.click(); // 选中
boolean b = radio.isSelected(); // 返回是否选中

复选框 checkBox

WebElement check = driver.findElement(By.id("checkBox"));
// 和单选框操作一致

弹窗Alert

// 弹窗有多种形式,有的弹窗只能选择取消确定,有的弹窗可以输入文字
// 当弹窗元素出现时:
Alert alert = driver.switchTo().alert();
String content = alert.getText(); // 获取alert的文字提示内容
alert.sendKeys("hello"); // 给alert输入文字
alert.dismiss(); // 按取消键
alert.accept(); // 按确定键
操作Frame中的页面元素:重点

frame页面,就是在原有的html结构中又插入了html,这个插入的html用iframe标签嵌套。一般在评论页面比较常见,如果查找的元素在frame中,那么必须要通过代码“进入”frame,否则会找不到元素报错,进入frame操作元素完成后,要记得跳出frame。

driver.switchTo().frame("leftframe"); // 进入id为leftframe的frame页面
driver.switchTo().frame(0); // 进入索引为0的frame

driver.switchTo().defualtContent(); // 跳出frame
模拟键盘的操作:重点

一般在测试登录界面时可以用模拟键盘的操作取代查找元素。找到登录名,输入登录名,然后模拟键盘按下Tab键,(如果这个网页是支持按tab光标自动弹到密码框的话),然后sendKeys密码,然后模拟enter键登录。

Actions action = new Actions(driver);
action.KeyDown(Keys.TAB); // 按下tab键
action.KeyDown(Keys.SHIFT); // 按下shift键
action.KeyUpn(Keys.CONTROL); // 释放control键,注意时Down还是Up
// ...其他类似的,Keys.键名
// 实际操作时往往是按下就抬起,所以Down一下再Up一下比较麻烦,常用的是preform()
action.sendKeys("admin").perform(); // 在当前光标所在处输入adimin
action.sendKeys(Keys.ENTER).perform(); // 输入回车
模拟鼠标的操作:
// 在指定元素上悬浮
WebElement element = driver.findElement(By.id(""));
Actions action = new Actions(driver);
action.moveToElement(element).perform();

第五章:WebDriver 高级应用

测试对象状态
element.isDisplayed(); // 是否出现
element.isSelected(); // 是否可选中
element.isEnabled(); // 是否可用
执行js操作
JavascriptExecutor js = (JavascriptExecutor) driver; // 将driver强制转换类型
String title = (String) js.executeScript("return document.title"); // 执行js语句返回title
System.out.println(title);
窗口截屏
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");
String nowDateTime = sdf.format(new Date());
File s_file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
Files.copy(s_file, new File("D:\\demo\\" + nowDateTime + ".jpg"))
Webdriver的三种等待方式:重点

强制等待、隐式等待、显示等待。

强制等待,Thread.sleep(1000);

使用隐式等待的时候,实际上浏览器会在你自己设定的时间内不断的刷新页面去寻找我们需要的元素。

显示等待,明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就抛出Exception。

第六章:TestNG基础使用

TestNG的作用

使用TestNG可以非常方便的管理被测系统所有测试脚本。通过testng.xml控制测试用例执行的生命周期。

TestNG的常用注解:重点

注意的点:

  • TestNG在执行测试方法之前会重新实例化测试类,重新调用构造方法
  • 如果测试类有父类,那么会执行父类的构造方法,在执行父类的构造方法时会执行BeforeClass

注解的生效时机:https://blog.csdn.net/weixin_43237362/article/details/105262934

Annotations 含义
@Test 此注解的方法会被认为是一个测试方法,即一个测试用例
@BeforeMethod 被注释的方法将在每一个测试用例调用前运行
@AfterMethod 被注释的方法将在每一个测试用例调用后运行
@BeforeClass 被注释的方法将在当前类的第一个测试用例调用前运行
@AfterClass 被注释的方法将在当前类的所有测试用例调用后运行
@BeforeSuite 被注释的方法将在当前测试集合(suite)任一测试用例运行前运行
@AfterSuite 被注释的方法将在当前测试集合(suite)所有测试用例运行后运行
@BeforeTest 被注释的方法将在Test中第一测试用例开始运行前运行
@AfterTest 被注释的方法将在在Test中所有测试用例运行后运行
@BeforeGroups 被注释的方法将在分组测试用例的任一的测试用例前执行
@AfterGroups 被注释的方法将在分组测试用例的所有的测试用例后执行
测试方法的执行顺序:重点

默认测试方法的执行顺序是按照方法名的字典序(ascii)升序排序执行的。

还可以使用priority指定执行顺序(默认值为0),数值越小,越靠前执行。

@Test(priority = 0) 
public void testMethod() {
    
     } 
testng.xml的用例组织结构:重点
  • Test Suite由一个或者多个Test组成
  • Test由一个或多个测试class组成
  • 一个测试class由一个或多个测试方法组成
<suite name="">
  <test name="t1"> 
    <classes> 
       <class name="xml1.Demo1">
         <methods>
           <include name = "bTest" /> <!-- 可以通过在xml文件配置执行顺序 -->
           <include name = "aTest" />
         </methods>
       </class>
    </classes>
  </test>
</suite>
testng.xml的执行顺序:重点

test标签中的属性preserve-order=“true” 可以保证test标签下的方法按顺序执行

像上面的xml代码,属性值为true时,就是先运行bTest再运行aTest

parallel的取值:重点

suite标签中的parallel属性用来以多线程的方式运行测试用例。

parallel=“methods”:不同的线程中运行测试方法

parallel=“tests”:不同的线程执行test下的测试用例

parallel=“classes”:不同的线程执行classes下的测试用例

断言:重点
// 常用的
assertEquals(a,b) // 测试a是否等于b
assertTrue(a) // 测试a是否为true
编写测试用例步骤
  1. 编写测试代码逻辑
  2. 插入TestNG注解标签
  3. 匹配TestNG.xml文件,设置测试类、测试方法、测试分组的执行信息
  4. 执行TestNG查看测试报告
测试代码规范

测试类名用xxxTest结尾,测试方法用testXXX命名

第七章:TestNG高级应用

使用ITestContext共享数据

测试方法中的参数ITestContext可以设置key value值,然后在其他测试方法中获取,使用。

public class Demo2 {
    
    
@Test
public void test1(ITestContext content) {
    
    
	content.setAttribute("name", "tom");
	}
  
@Test
public void test2(ITestContext content) {
    
    
	System.out.println(content.getAttribute("name"));
	}
}

ITestListener、ITestResults:重点

测试类实现ITestListener接口,会实现onFinish、onTestSuccess、onTestFailure方法

ITestResults result作为方法参数,存放着测试方法的信息。

public class Demo1 implements ITestListener{
    
    

	// 所有测试用例执行完毕的时候
	@Override
	public void onFinish(ITestContext context) {
    
    
		ITestListener.super.onFinish(context);
		System.out.println("全部执行完毕");
	}
	
	// 测试用例执行失败
    // 当测试用例失败时,result中存放着失败的测试方法的信息
	@Override
	public void onTestFailure(ITestResult result) {
    
    
		ITestListener.super.onTestFailure(result);
		System.out.println("失败:" + result.getInstanceName() + " " + result.getName());
	}
	
	@Override
	public void onTestSuccess(ITestResult result) {
    
    
		ITestListener.super.onTestSuccess(result);
	}
}

第八章:页面对象(Page Object)模式

什么是PO模式?重点

UI测试中,每个页面都会进行很多的控件操作,比如点击按钮,输入文字等等操作,这些寻找元素和对元素操作的方法单独存放到一个类中。针对该页面的测试代码单独存放于另一个类中。这样页面元素变化后,只更改对元素的操作方法就行了,不需要更改测试代码。

第九章:数据驱动模式

什么是数据驱动模式?重点

测试脚本需要大量的测试数据,这些测试数据不存放于代码中,而是存放在其他存储文件里,例如txt、excel、数据库。这样在测试用例的数据方式改变后直接去文件中修改,不需要更改代码。

相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为进行了完全的分离。这样的测试脚本设计模式称为数据驱动。

// 从代码中提供数组信息
public class DataProvider {
    
    
	@DataProvider(name="para1") // 提供数据的方法要加上@DataProvider,并且指定name
	public Object[][] getArrayData() throws IOException{
    
    
		return new Object[][] {
    
     
			{
    
    "战狼3", "吴京", "吴京", "2020-01-15"},
			{
    
    "战狼3", "吴京", "吴京", "2020-01-15"},
			{
    
    "战狼3", "吴京", "吴京", "2020-01-15"}
		};
	}
}

// 获取提供的数据,进行测试
public class DataProviderTest {
    
    
    // dataPrivider的值必须要和提供数据的方法的@DataProvider的name保持一致
    // dataProviderClass就是提供数据类的class
    // 数据获取到之后,可以直接匹配到参数里使用
	@Test(dataProvider="para1", dataProviderClass = DataProvider.class)
	public void testFromArray(String fname, String director, String editor, String showtime) {
    
    
		System.out.println(fname + " " + director + " " + editor + " " + showtime);
	}
}   
// 从txt中获取数据
public class TXTDataProvider {
    
    
    @DataProvider(name="para2")
	public Object[][] getTXTData() throws IOException{
    
    
      
		// 数据容器
		List<String[]> list = new ArrayList<>();
		
		// BufferedReader一行一行读取
		FileInputStream file = new FileInputStream(filename);
		InputStreamReader isr = new InputStreamReader(file);
		BufferedReader br = new BufferedReader(isr);
		String line;
		
		// split分割一行
		while((line = br.readLine()) != null) {
    
    
			String[] record = line.split("    ");
			// 字符数组放进list
			list.add(record);
		}
		
		// 容器中的数据放入Object数组
		Object[][] data = new Object[list.size()][];
		for(int i = 0; i < list.size(); i++) {
    
    
			data[i] = list.get(i);
		}
		
		return data;
	}
}

public class DataProviderTest {
    
    
	@Test(dataProvider="para2", dataProviderClass = TXTDataProvider.class)
	public void testFromTXT(String fname, String director, String editor, String showtime) throws IOException {
    
    
		System.out.println(fname + " " + director + " " + editor + " " + showtime);
	}
}  

excel、数据库驱动模式类似,不同的只是读取数据的逻辑不同。excel和数据库考到的可能不大。

第十章 Selenium Grid

什么是Selenium Grid?重点

seleniumGrid是selenium三大组件之一,主要用来分布式测试和并发测试。通过selenium grid,可以将测试代码运行到其他的计算机上,提高测试用例执行速度。

一般用grid将测试用例运行在多个浏览器上,或者不同的操作系统上,以此测试在不同平台上能否正常工作。

第十一章 使用Log4j2打印执行日志

知道使用Log4j2打印执行日志即可。

第十二章 Ant使用

什么是Ant?重点

一种构建工具,它可以将所有繁琐的工作任务自动化完成,包括编译代码、运行测试以及程序打包和重发布。

猜你喜欢

转载自blog.csdn.net/weixin_43237362/article/details/108479920
今日推荐