(1)testng一款单元测试框架,也可以用来做自动化,比junit强大
(2) testng安装
1.离线安装
2.在线安装
硬性要求:JDK1.7以上版本、Eclipse4.2以上版本。
安装参考:https://blog.csdn.net/kdyyh/article/details/78483663
eclispe下载:https://www.eclipse.org/downloads/packages/
但是安装了新版本:testng还是安装失败【离线,在线都不ok】---解决办法:
http://beust.com/eclipse这个网址已经失效了,所以更换成下面地址在尝试在线安装,结果成功了
http://dl.bintray.com/testng-team/testng-eclipse-release/------------如何找到这个网址:访问下面的链接:
https://testng.org/doc/eclipse.html#eclipse-installation----------点击这个即可It has its own project repository called testng-eclipse).--------跳转到github-----可以看到有很多参考的site
(3)testng坐标导入
坐标版本不能超过按装好的testng插件版本
上面是对testng简单介绍,下面开始创建maven项目:
file->new->project->搜索maven->maven project->勾选create a simple project->点击next
填写下面2项即可
Group Id:com.lemon
Artifact Id: java_api_day01
点击finish
3)working sets管理项目【为了方便管理项目,起到收藏的效果,当然不设置也可以】
new->other->搜索Java Working Set->输入Working set name->Workspace content选择要加入到Working set name的项目,点击add->点击finish->点击倒三角view menu,切换视图->Top level element->默认是以project置顶,这里我们选择Working sets
可以看到api里面的项目全部置顶
4)添加testng的maven坐标
搜索:testng
选择Usages数据量比较大的,找到坐标,如下图示例:
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
将找到的坐标,copy到pom.xml文件中
pom.xml文件如下:加粗部分即是testng坐标【以后所有的依赖都要放在<dependencies></dependencies>中】
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lemon</groupId>
<artifactId>java_day01_api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
>
**<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>**
</dependencies>
</project>
5)如何使用testng
1)测试 类
1.编写测试类
2.用@Test这个测试注解来标识测试方法
3.在测试方法中实现测试逻辑,拿到实际测试结果,跟期望值进行比较
4.执行测试方法
src/test/java下面创建TestNgDemo.java
1)先创建包
new->Package
输入包名:com.lemon.testng
2)在创建类
new->Class
输入类名:TestNgDemo
点击finish
3) TestNgDemo.java代码如下:
- 不加注解
package com.lemon.testng;
public class TestNgDemo {
// 不需要再写main方法了,程序的入口testng框架已经帮我们写好了
public void test() {
System.out.println("这是一个测试方法");
}
public void test2() {
System.out.println("这是一个不会被执行的方法");
}
}
执行上面代码:
右键Run as->无java application 选项【因为没有找到程序的入口】也无TestNG test选项【因为没有注解,testng无法识别】,无法运行程序
2.加注解
package com.lemon.testng;
import org.testng.annotations.Test;
public class TestNgDemo {
// 不需要再写main方法了,程序的入口testng框架已经帮我们写好了
// 1.@Test是注解
// 2.testng框架能够识别@Test注解,@Test注解用来标识该方法是一个testng测试方法
@Test
public void test() {
System.out.println("这是一个测试方法");
}
@Test
public void fuction() {
System.out.println("这是第二个被执行的方法");
}
@Test
public void exec() {
System.out.println("这是第三个被执行的方法");
}
public void a() {
System.out.println("这是一个不会被执行的方法");
}
}
有了注解,testng才能识别(注解就相当于是入口)
执行上面代码:
右键Run as->TestNg test【加注解就会有这个选项】
执行结果:
[RemoteTestNG] detected TestNG version 6.9.9
[TestNG] Running:
C:\Users\USER\AppData\Local\Temp\testng-eclipse-258025461\testng-customsuite.xml
这是第三个被执行的方法
这是第二个被执行的方法
这是一个测试方法
PASSED: exec
PASSED: fuction
PASSED: test
===============================================
Default test
Tests run: 3, Failures: 0, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================
[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@e580929: 10 ms>
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@5e025e70: 36 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 0 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@2d209079: 9 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@66d33a: 58 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@3cb5cdba: 5 ms
从执行结果可以看出:a()这个方法没有被执行【如果要被执行:再加一个注解@Test即可】
上面方法的执行顺序:是按照方法名的首字母字典顺序执行的
3.断言类
assert.assertEquals(实际值, 期望值);
package com.lemon.testng;
import org.testng.annotations.Test;
import junit.framework.Assert;
public class TestNgDemo {
// 不需要再写main方法了,程序的入口testng框架已经帮我们写好了
// 1.@Test是注解
// 2.testng框架能够识别@Test注解,@Test注解用来标识该方法是一个testng测试方法
@Test
public void test() {
System.out.println("这是一个测试方法");
}
@Test
public void test2() {
//assert.assertEquals(actual, expected);
//assert.assertEquals(实际值, 期望值);
Assert.assertEquals(true ,false);
}
@Test
public void test3() {
//assert.assertEquals(actual, expected);
Assert.assertEquals(2,2);
}
}
上面代码执行结果如下:
[RemoteTestNG] detected TestNG version 6.9.9
[TestNG] Running:
C:\Users\USER\AppData\Local\Temp\testng-eclipse-1596998653\testng-customsuite.xml
这是一个测试方法
PASSED: test
PASSED: test3
FAILED: test2
junit.framework.AssertionFailedError: expected:<true> but was:<false>
at junit.framework.Assert.fail(Assert.java:50)
at junit.framework.Assert.failNotEquals(Assert.java:287)
at junit.framework.Assert.assertEquals(Assert.java:67)
at junit.framework.Assert.assertEquals(Assert.java:147)
at junit.framework.Assert.assertEquals(Assert.java:153)
at com.lemon.testng.TestNgDemo.test2(TestNgDemo.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:816)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1124)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:774)
at org.testng.TestRunner.run(TestRunner.java:624)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:359)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)
at org.testng.SuiteRunner.run(SuiteRunner.java:261)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.run(TestNG.java:1048)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
===============================================
Default test
Tests run: 3, Failures: 1, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 3, Failures: 1, Skips: 0
===============================================
[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@e580929: 11 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@5e025e70: 49 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 10 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@2d209079: 10 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@66d33a: 48 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@3cb5cdba: 8 ms
- 配置文件-测试套件
suite元素:测试套件(测试集合)----可以理解成项目【只能有有一个】
test元素:测试模块----可以理解为功能模块【模块可以有多个】
classes:测试类集合
class :测试类路径-----包名+类名【你要测试的测试类,也可以有多个】
在项目的根目录底下创建testng.xm
一个suite(套件)由一个或多个测试模块构成
一个test(测试)由多个类组成
如何快捷复制测试类路径:
1 打开你的测试类即java文件,在类名上右键>copy>Copy Qualified Name
2 打开testng.xml文件,copy到 <class name="com.lemon.testng.TestNgDemo"/>
3 如何测试copy的全类名是否正确,按住ctrl键,光标放在com.lemon.testng.TestNgDemo上面,如果出现小手,点击可以动态跳到TestNgDemo文件,说明copy的全类名正确
如何修改xml的字体大小:
windows->Preference->搜索font
找到 Structured Text Editor 此项是用来修改xml文件的字体
testng.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="项目名" parallel="false">
<test name="功能模块">
<classes>
<class name="com.lemon.testng.TestNgDemo"/>
</classes>
</test>
<test name="功能模块2">
<classes>
<class name="com.lemon.testng.TestNgDemo2"/>
</classes>
</test>
</suite>
执行:【注意:是在文件上运行,不是打开文件在文件里面执行】
在testng.xml文件上右键,Run as->TestNG suite
运行结果:
上图乱码如何解决:
找到eclipse的安装路径下的eclipse.ini文件,在最后一行加入-Dfile.encoding=UTF-8
重启Eclipse
再次运行:
发现控制台不乱码了,但是java文件里面又出现乱码了-------原因:修改编码之前用的是gbk编码,所以修改成UTF-8又乱码了---前后编码不一致-----解决:删除乱码,重新写入即可---重新写入的不会乱码
另:
1 testng.xml也可以自动生成【一般不推荐】
方法:
1 在项目名上,右键new->other->搜索TestNG->点击TestNG class
Sourec folder: \java_day01_api\src\test\java ----项目的默认路径
Package Name: ----如果不填,点击finish会生成一个默认包
class name: New Test ----默认生成一个测试类文件
Xml suite file: 这里输入你的xml文件名
点击finish
则在\java_day01_api\src\test\java 路径下生成2个文件:
1 New Test.java
2 xml文件
2 testng插件也可以不用安装,直接引用jar包也是可以用的,但是如果不安装插件,执行套件没有TestNG suit,只能通过命令来执行