测试过程hook

TestNG提供了很多好用的监听器,假设我们想监听测试脚本执行过程的各个阶段,TestNG就提供了这样的一个监听器,我们只需要去实现监听器接口,然后重写各个测试阶段的方法即可,这样就可以在测试执行的各个阶段去做我们想做的事情了。TestNG提供的接口是ITestListener,这时候可以新建一个包如listeners,然后新建一个类如TestListener,让该类实现
ITestListener这接口,然后复写这个接口的方法,如下所示:
package appium.listeners;

import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;

public class TestListener implements ITestListener{

public void onTestStart(ITestResult iTestResult) {

}

public void onTestSuccess(ITestResult iTestResult) {

}

public void onTestFailure(ITestResult iTestResult) {

}

public void onTestSkipped(ITestResult iTestResult) {

}

public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) {

}

public void onStart(ITestContext iTestContext) {

}

public void onFinish(ITestContext iTestContext) {

}
}
要控制测试哪个执行阶段就只需要复写上面对应阶段的方法即可,如我们想在测试执行失败的时候添加个失败截图的处理,这时候我们就可以复写onTestFailure即可,在这个方法里添加错误截图的实现就可以了。
错误截图需要使用到Driver对象的引用,这时候需要去测试父类了添加一个静态的方法来返回Driver的对象引用,更新完的父类如下:
package appium.common;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;

import java.io.File;
import java.net.URL;

public class BasicTestCase {
//声明静态的对象引用driver
static AppiumDriver driver;
private Helper helper;
public PageHelper pageHelper;

@BeforeMethod
public void setUp() throws Exception {
File app = new File(System.getProperty(“user.dir”), “AUT/osc.apk”);
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(“deviceName”, “My Android Device”);
capabilities.setCapability(“app”, app.getAbsolutePath());
capabilities.setCapability(“appPackage”, “net.oschina.app”);
capabilities.setCapability(“appActivity”, “net.oschina.app.AppStart”);
capabilities.setCapability(“noReset”, true);
capabilities.setCapability(“unicodeKeyboard”, true);
File chromeDriverPath = new File(System.getProperty(“user.dir”));
capabilities.setCapability(“chromedriverExecutable”,chromeDriverPath.getAbsolutePath()+”/chromedriver”);
driver = new AndroidDriver(new URL(“http://127.0.0.1:4723/wd/hub“), capabilities);
helper = new Helper(driver);
pageHelper = new PageHelper(helper);
//跳转到我的设置页面
pageHelper.getPageCommon().goToMySettingsTab();
//判断是否是登录状态,是的话就退出,不是的话就不做处理
if(“aotu12345aotu”.equals(pageHelper.getPageMySettings().getNickName())){
pageHelper.getPageMySettings().clickSettingsBtn();
pageHelper.getPageSettings().clickLogout();
}
//回到首页,每个测试脚本的入口就是首页
pageHelper.getPageCommon().goToHomeTab();
}

@AfterMethod
public void tearDown() throws Exception {
driver.quit();
}

//添加获取driver对象引用的方法

public static AppiumDriver getDriver(){
return driver;
}

}
这时候就可以直接来实现错误的截图逻辑了,更新onTestFailure为如下:
public void onTestFailure(ITestResult iTestResult) {
//构造输出对象
File srcFile = BasicTestCase.getDriver().getScreenshotAs(OutputType.FILE);
//拼接错误截图的名称(类名+方法名)
String scriptName = iTestResult.getMethod().getRealClass().getSimpleName() + “.” + iTestResult.getMethod().getMethodName();
DateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd HH-mm-ss”);
//设置截图存放路径
String destDir = “screenshots”;
//拼接最后的错误截图名称(类名+方法名+时间戳.png)
String fileName = scriptName + dateFormat.format(new Date()) + “.png”;
try {
FileUtils.copyFile(srcFile,new File(destDir + “/“ + fileName));
} catch (IOException e) {
e.printStackTrace();
}
}
实现好了这个接口后如何在脚本执行过程中让其生效呢?这时候我们还需要去上节课创建的配置文件里去声明这个监听器的实现即可,如下所示:
<!DOCTYPE suite SYSTEM “http://testng.org/testng-1.0.dtd“ >












因为这个脚本VersionCheck这个脚本我们故意让其执行失败了,这时候只需要执行下这个suite就可以验证下当脚本执行失败会不会添加错误截图,并且错误截图的名称是按类名+方法名和时间戳结合命名的。按照上节介绍的方式执行下这个脚本,可以看到会在测试工程根目录下创建了个screenshots文件夹并产生错误截图,如下所示:
Appium系列|Appium测试框架完善(二) - 图1
Appium系列|Appium测试框架完善(二) - 图2