Java语言编写的WebDriver测试程序通常使用单元测试框架运行,所以有必要了解单元测试框架的基本方法及单元测试框架的使用技巧。
JUnit单元测试框架是基于Java语言的主流单元测试框架,多数Java IDE软件都已经集成了JUnit单元测试框架。JUnit单元测试框架是目前最普遍使用的单元测试框架之一。
JUnit是由Erich Gamma和Kent Beck编写的一个回归测试框架(Regression Testing Framework),主要用于Java语言程序的单元测试,目前使用的主流版本是JUnit4以上版本。
1、启动eclipse,新建一个java工程,例如名字为JUnit4Proj。
2、在新建工程名称上单击右键,在弹出的快捷菜单中选择“Properties”命令。
3、弹出当前工程的属性对话框,选择“Java Build Path”选项,单击“Libraries”标签,单击“Add Library”按钮。
4、在弹出的对话框中,选择JUnit选项,单击“Next”按钮。
5、在弹出的“JUnit Library”对话框中,单击“Finish”按钮。
6、在“Java Build Path”对话框中,显示JUnit图标,表示引入JUnit4成功。
JUnit常见的注解及其含义如下表所示:
注解名称 |
注解含义 |
@BeforeClass |
当我们运行几个有关联的用例时,可能会在数据准备或其它前期准备中执行一些相同的命令,这个时候为了让代码更清晰,更少冗余,可以将公用的部分提取出来,放在一个方法里,并为这个方法注解@BeforeClass。此注解的方法在测试类呗调用之前执行,在一个测试类中,只能声明此注解一次。方法名可以任意,但必须是public static void,即公开、静态、无返回。这个方法只会运行一次。 |
@AfterClass |
跟@BeforeClass对应,在测试类里所有用例运行之后,运行一次。用于处理一些测试后续工作,例如清理数据,恢复现场。表示使用此注解的方法在测试类被调用结束退出之前执行,在一个测试类中只能声明此注解一次,同样必须是public static void,即公开、静态、无返回。这个方法只会运行一次。 |
@Before |
@Before不止运行一次,它会在每个用例运行之前都运行一次,即有多少个@Test方法,那@Before注解方法就会被调用多少次,必须是public void,不能为static。主要用于一些独立于用例之间的准备工作。比如两个用例都需要读取数据库里的用户A信息, 但第一个用例会删除这个用户A,而第二个用例需要修改用户A。那么可以用@BeforeClass创建数据库连接。用@Before来插入一条用户A信 息。 |
@After |
与@Before对应,是在每个用例运行之后都运行一次。 |
@Test |
在junit3中,是通过对测试类和测试方法的命名来确定是否是测试,且所有的测试类必须继承junit的测试基类。在junit4中,定义一个 测试方法变得简单很多,只需要在方法前加上@Test就行了。使用此注解的方法为一个单元测试用例,在一个测试类中可以多次声明此注解,每个注解@Test的方法只被执行一次。测试方法必须是public void,即公共、无返回数据。可以抛出异常。 |
@Ignore |
表示暂时不运行某些测试方法\测试类,可以在方法前加上这个注解。在运行结果中,junit会统计忽略的用例数,来提醒你。但是不建议经常这么做,因为这样的坏处时,容易忘记去更新这些测试方法,导致代码不够干净,用例遗漏。 |
1、在eclipse中,新建工程JUnitProj
2、新建一个package,命名为cn.om
3、在这个包下,新建测试类Calculator,代码如下
package cn.om;
public class Calculator {
public int result = 0;
public int add(int operand1, int operand2) {
result = operand1 + operand2;
return result;
}
public int subtract(int operand1, int operand2) {
result = operand1 - operand2;
return result;
}
public int multiple(int operand1, int operand2) {
result = operand1 * operand2;
return result;
}
public int divide(int operand1, int operand2) {
result = operand1 / operand2;
return result;
}
public int getResult() {
return result;
}
}
4、创建JUnit4的测试代码:
(1)、在cn.om包下,创建一个JUnit Test Case。
(2)、在弹出的对话框中,在“Name”中输入CalculatorTest,并勾选以下几个方法,并在“Class under test”输入框中输入“cn.om.Calculator”,点击Finish即可。
(3)、eclipse自动生成代码,如下图所示
(4)、在生成的用例模板中,根据实际需求,编写单元测试代码。针对Calculator类的内部实现逻辑,测试代码如下:
package cn.om;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
public class CalculatorTest {
private static Calculator cal = new Calculator();
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("@BeforeClass");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("@AfterClass");
}
@Before
public void setUp() throws Exception {
System.out.println("测试开始");
}
@After
public void tearDown() throws Exception {
System.out.println("测试结束");
}
@Test
public void testAdd() {
cal.add(1, 2);
assertEquals(3, cal.getResult());
// fail("Not yet implemented");
}
@Test
public void testSubtract() {
cal.add(3, 2);
assertEquals(1, cal.getResult());
// fail("Not yet implemented");
}
@Ignore
public void testMultiple() {
cal.add(1, 2);
assertEquals(2, cal.getResult());
// fail("Not yet implemented");
}
@Test(timeout = 2000)
public void testDivide() {
for (;;)
;
}
@Test(expected = ArithmeticException.class)
public void testDivideByZero() {
cal.divide(4, 0);
}
}
5、执行测试类,结果如下,4个测试用例只有testDivide方法执行失败,其他3个方法均被执行成功。
控制台输入结果为:
1、在Console界面的输出结果中,可以看出setUpBeforeClass()和tearDownAfterClass() 方法在整个测试用例运行过程中,只被运行了一次,setUp()和tearDown()方法在每次@Test方法执行之前都被调用,执行多次。
2、代码中@Test(timeout = 2000)标识此测试用例执行时间,不能超过2000毫秒,即2秒。由于该方法是死循环,一定会超过2秒,因此执行结果为失败。
3、代码中@Test(expected= ArithmeticException.class)表示此方法执行后,必须抛出ArithmeticException异常错误才能认为测试执行成功。此方法的实现代码包含4/0的非法计算逻辑,因为除数不能为0,因此测试程序执行后会抛出ArithmeticException异常。此测试方法接收抛出的异常,判断是否ArithmeticException异常,如果是,则这个测试用例是成功。这个方法用于验证某种异常是否被正确抛出。
4、包含assert关键字的方法通常被称为断言方法。用于判断期望结果是否与代码实际执行结果一致。如果一致则继续执行后续代码,如果不一致则设定这个测试用例的执行状态为失败,且不会执行后续代码逻辑。
具体创建步骤如下:
1、在前面的JUnitProj项目中,再创建一个测试类,名为“TestCalculator2”,测试类具体代码如下:
package cn.om;
import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test;
public class CalculatorTest2 {
@Test
public void test() {
System.out.println("CalculatorTest2测试方法被调用!");
}
}
2、成功创建后,在工程名称上,单击右键,弹出的快捷菜单中选“New”-“other”命令,如下图所示。
3、在弹出的对话框中,选择Java——JUnit下的“JUnit Test Suite”选项,再单击“Next”按钮。
4、勾选“CalculatorTest”和“CalculatorTest2”两个类,再单击“Finish”。
5、eclipse生成一个名为AllTests的测试类,具体代码如下:
6、执行这个类,单击执行按钮,可以看到两个测试类的测试方法都被执行,并输出以下结果
JUnit Test Suite主要是为了批量执行不同测试类中的测试用例,自动化测试工程师可以根据测试需求生成不同的组合的测试用例结合。
package cn.om;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class FirstJunitWebDriverDemo {
public WebDriver driver;
String baseURL = "http://www.baidu.com";
@Before
public void setUp() throws Exception {
System.setProperty("webdriver.firefox.bin",
"E:\\Mozilla Firefox\\firefox.exe"); // 设置firefox浏览器的安装路径
driver = new FirefoxDriver();
}
@After
public void tearDown() throws Exception {
driver.quit(); // 关闭打开的浏览器
}
@Test
public void test() {
// 打开百度首页
driver.get(baseURL);
// 在搜索框中输入selenium
driver.findElement(By.id("kw")).sendKeys("selenium");
// 单击“搜索”按钮
driver.findElement(By.id("su")).click();
}
}
脚本说明:
1、在setup函数中进行测试开始前的准备工作,在这个例子中的准备工作是打开Firefox浏览器。
2、在tearDown函数中主要负责测试用例执行后的环境清理和还原工作,本例子中的清理工作就是关闭已经打开的浏览器。
3、test函数里的就是需要执行的测试代码。