自动化测试方案调研
自动化测试的意义和优点
自动化测试定位在冒烟测试和回归测试。冒烟测试主要针对于主流程主功能的测试工作;回归测试指的是新增功能的时候使用自动化测试验证原有功能是否有效。手工完成一些软件测试的工作(例如大量低级接口的回归测试)十分艰苦耗时,而且寻找某些种类的缺陷时效率并不高,因而测试自动化,提供一种完成这类工作的有效方法。一旦自动化测试方法开发完成,日后的测试工作将可以高效循环完成。很多时候这是针对软件产品进行长期回归测试的高效方法。
局限性
长期来看自动化测试可以带来开支上的节省,但是短期全部自动化还是可能产生巨大的开销,因为测试结果分析、测试脚本维护和编写仍然需要人力投入。
自动化测试分层
基于图形用户交互界面测试:
基于用户界面(GUI)的测试使用能够产生图形用户界面操作(如出表点击、键盘输入等)的测试框架,模拟用户动作来以观察、验证程序是否正确的响应。
接口测试:
接口测试指的是通过调用接口(API)绕过GUI,,以应用到验证的行为进行测试。通常API动绕过测试的应用程序的用户界面。它也可以测试公共的接口,以类、模块都经过测试,有各种各样的输入参数来验证返回的结果是正确的。
单元测试:
对软件中最小的可测试单位进行检查和验证
案例
UI自动化测试
方案一:
工具:Selenium
概述:Selenium是用户Web应用程序测试的工具,测试直接运行在浏览器中,就像真正的用户在操作一样,支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。
集成Java步骤:
-
添加依赖
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> </dependency>
-
下载驱动指定路径
System.setProperty("webdriver.chrome.driver", "Q:\\chromedriver.exe");
-
简单样例
//获取baidu的标题 public class App { public static void main( String[] args ) { System.setProperty("webdriver.chrome.driver", "D:\\driver\\chromedriver.exe"); WebDriver driver=new ChromeDriver(); driver.get("http://www.baidu.com"); String title = driver.getTitle(); System.out.println("获得的标题为:"+title); driver.close(); } }
缺点:脚本维护和编写仍然需要人力投入
方案二:
使用自动化测试工具录制步骤
工具:UIBot
概述:工具提供了记录和回放功能,允许交互式地记录用户的操作,并对用户的操作进行任意次数的回放,将实际结果与预期结果进行比较。
优点:几乎不需要软件开发。可以应用于任何具有图形用户界面的应用程序。
缺点:会带来重大的可靠性和可维护性问题。重新标注一个按钮或将其移动到窗口的另一部分,可能需要重新录制测试案例。记录和回放也可能会增加一些不相关的活动或者错误地记录一些活动。
接口自动化测试
成熟案例:Lego美团接口自动化测试实践(系统不开源,只提供思路)
结构:
脚本部分采用常见的Jenkins+TestNG的结构
将自动化测试用例存储至MySQL数据库中,做成比较常见的“数据驱动”做法。XML中的SQL决定了执行什么用例,执行多少用例,SQL的搜索结果为需要测试的测试用例。
脚本代码
public class TestPigeon {
String sql;
int team_id = -1;
@Parameters({"sql", "team_id"})
@BeforeClass()
public void beforeClass(String sql, int team_id) {
this.sql = sql;
this.team_id = team_id;
ResultRecorder.cleanInfo();
}
/**
* XML中的SQL决定了执行什么用例, 执行多少条用例, SQL的搜索结果为需要测试的测试用例
*/
@DataProvider(name = "testData")
private Iterator<Object[]> getData() throws SQLException, ClassNotFoundException {
return new DataProvider_forDB(TestConfig.DB_IP, TestConfig.DB_PORT,
TestConfig.DB_BASE_NAME,TestConfig.DB_USERNAME, TestConfig.DB_PASSWORD, sql);
}
@Test(dataProvider = "testData")
public void test(Map<String, String> data) {
new ExecPigeonTest().execTestCase(data, false);
}
@AfterMethod
public void afterMethod(ITestResult result, Object[] objs) {...}
@AfterClass
public void consoleLog() {...}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Pigeon Api测试" parallel="false">
<test name="xxx-xxx-service">
<parameter name="sql"
value="SELECT * FROM API_PigeonCases
WHERE team_id=2
AND isRun=1
AND service='xxx-xxx-service'
AND env='beta';"/>
<classes>
<class name="com.dp.lego.test.TestPigeon"/>
</classes>
</test>
<listeners>
<listener class-name="org.uncommons.reportng.HTMLReporter"/>
<listener class-name="org.uncommons.reportng.JUnitXMLReporter"/>
</listeners>
</suite>
使用SQL最大的好处就是灵活
如上面的这个例子,在数据库中会查询出下面这56条测试用例,那么这个标签就会对这56条用例进行逐一测试。
具体流程:
其他运行界面截图: