搭建自动化测试框架时遇到的一些坑,以及解决办法
1. 问题:test case放入testng.xml,单线程运行多个用例,结果每个用例都会启动一个浏览器,但所有用例都在最后打开的浏览器里执行。
可能原因:每个test case 启动都会初始化一个driver,导致每执行一个test case 就会启动一个浏览器窗口
解决办法:创建一个BaseCase类,里面再创建一个内部类DriverManager, 把对driver的操作都放在DriverManager类里,所有test case类都继承BaseCase类。
PS: 代码里的ThreadLocal 类,EventFiringWebDriver类, 和 LogEventListener类, 参考 webdriver 事件监听 和 TestNG多线程并发
package com.changefinancial.TestCases; import com.changefinancial.pages.Login; import com.changefinancial.pages.SystemAdminLoginPage; import com.changefinancial.pages.UserDevicePage; import com.changefinancial.utils.Action; import com.changefinancial.utils.LogEventListener; import org.apache.log4j.xml.DOMConfigurator; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.events.EventFiringWebDriver; import org.testng.annotations.AfterMethod; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import java.util.concurrent.TimeUnit; public class BaseCase { /* all test case script class will extend this class to get fundamental functions. */ public BaseCase(){ @AfterMethod(alwaysRun = true) protected void testMethodEnd(){ DriverManager.quitDriver(); } /* 1.register LogEventListener to EventFiringWebDriver so that actions can be captured in class LogEventListener can be captured. 2.use ThreadLocal to make sure one driver only bind one thread, so that multiple threads can be used in safe mode(operation in browser1 won't jump to browser2) */ public static class DriverManager { public static ThreadLocal<WebDriver> ThreadDriver = new ThreadLocal<WebDriver>(); public static WebDriver getDriver(){ WebDriver driver = DriverManager.ThreadDriver.get(); if(driver == null){ System.setProperty("webdriver.chrome.driver",System.getProperty("user.dir")+"/src/main/java/com/driver/chromedriver.exe"); driver = new EventFiringWebDriver(new ChromeDriver()).register(new LogEventListener()); ThreadDriver.set(driver); //wait 3 seconds before trying to find element DriverManager.getDriver().manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); } return driver; } public static void quitDriver(){ getDriver().quit(); DriverManager.ThreadDriver.set(null); } } }
2. 问题:在使用allure优化测试报告后,在测试报告的主页里,test case 会将上次运行的测试用例数与当前执行的测试用例数相加,导致显示的这次用例执行数不正确。
解决办法:(windows系统里)用运行批处理文件的方式在每次执行测试之前删除测试结果里的文件
3. 问题:Jenkins 通过testng.xml执行测试用例,如果有测试用例失败(Assert 为false),则会导致build 被标记为failure
解决办法:在pom.xml里,插件 maven-surefire-plugin 的配置行里写入<testFailureIgnore>true</testFailureIgnore>
4. 问题: 运行testng.xml时,启动失败,提示不能加载xxx Listener,
解决办法:Run-》Edit Configurations-》TestNG-》Configuration-》Listenners里面可以设置
5. 问题: 用POI工具读取excel里的数据,在执行cell.getStringCellValue()时报错 Cannot get a STRING value from a NUMERIC cell
//获取单元格 XSSFCell cell=row.getCell(0); //获取单元格数据 cell.getStringCellValue(),
在执行到获取单元格数据时报错:Cannot get a STRING value from a NUMERIC cell
在number类型转化为String类型的过程中造成了Cannot get a STRING value from a NUMERIC cell这样的问题,因此需要在读取excel单元格数据转化之前设置单元格类型为String,代码如下
//获取单元格 XSSFCell cell=row.getCell(0); //设置单元格类型 cell.setCellType(CellType.STRING) //获取单元格数据 cell.getStringCellValue(),
6. 用java.nio.file.Files读取文件时,出现错误提示java.nio.charset.MalformedInputException: Input length = 1
执行 Files.readAllLines(文件路径) 时出现错误提示java.nio.charset.MalformedInputException: Input length = 1,原因是系统读取文件的编码和文件实际编码不一致,解决办法是参数中加入文件编码
Files.readAllLines(path, Charset.forName("xxx"))
我的文件是在Windows系统里,用Notepad++打开后查看编码是ANSI, 但编码参数写成Charset.forName("ANSI")是错的,没有这个编码,必须改成 Charset.forName("Cp1252")
常见编码可以查看https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html
7. allure的测试结果生成路径可以通过在pom.xml里进行如下设置获得:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.20</version> <configuration> ... <systemPropertyVariables> <allure.results.directory>path to allure-results</allure.results.directory> </systemPropertyVariables> </configuration> ... </plugin> </plugins> </build>
8. maven 编译报错.
在执行maven编译项目的时候,报错 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project CPS: Fatal error compiling: error: invalid target release: 11.0
查了很多资料,都是说系统的jdk版本和maven 要编译的版本不一致,我查了自己的配置,都是一致的,都是11.02版本,所以查了很多资料,但问题一直没得到解决,偶然机会做了如下改动, 结果成功了
9. jenkins 报错:java.io.IOException: Can't find allure commandline <null>
解决办法:jenkins - > Global Tool Configuration - >Allure Commandline installations 里 Installation directory 不要包含bin目录,只到安装目录即可,如下图所示