<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TestNG教程 on 重定向学院</title><link>https://itest2025.pages.dev/categories/testng%E6%95%99%E7%A8%8B/</link><description>Recent content in TestNG教程 on 重定向学院</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 17 Jun 2025 17:29:15 +0800</lastBuildDate><atom:link href="https://itest2025.pages.dev/categories/testng%E6%95%99%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>（一）TestNG介绍与安装</title><link>https://itest2025.pages.dev/tutorials/36-001-%E4%B8%80testng%E4%BB%8B%E7%BB%8D%E4%B8%8E%E5%AE%89%E8%A3%85/</link><pubDate>Sat, 25 Nov 2017 12:55:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-001-%E4%B8%80testng%E4%BB%8B%E7%BB%8D%E4%B8%8E%E5%AE%89%E8%A3%85/</guid><description>&lt;h4 id="介绍">介绍&lt;/h4>
&lt;hr>
&lt;p>TestNG 官方网址：http://testng.org/doc/&lt;/p>
&lt;p>TestNG是一个测试框架的灵感来自JUnit和NUnit,但引入一些新的功能，使它更强大和更容易使用，如：&lt;/p>
&lt;ul>
&lt;li>注释。&lt;/li>
&lt;li>在任意大线程池中运行测试，并提供各种策略（所有方法都在自己的线程中，每个测试类有一个线程，等等）。&lt;/li>
&lt;li>测试你的代码多线程是安全的。&lt;/li>
&lt;li>灵活的测试配置。&lt;/li>
&lt;li>数据驱动的测试支持（@dataProvider）。&lt;/li>
&lt;li>参数支持。&lt;/li>
&lt;li>强大的执行模型(不再有TestSuite)。&lt;/li>
&lt;li>通过各种工具和插件支持（Eclipse, IDEA, Maven 等..）。&lt;/li>
&lt;li>通过进一步的灵活性Beanshell。&lt;/li>
&lt;li>运行时和日志的默认JDK功能(无依赖性)。&lt;/li>
&lt;li>应用服务器测试的相关方法。&lt;/li>
&lt;/ul>
&lt;p>TestNG 表示下一代(Next Generation的首字母)。它的设计覆盖所有类别的测试：单元、功能、端到端、集成等。&lt;/p>
&lt;h4 id="安装">安装&lt;/h4>
&lt;hr>
&lt;p>本教程基于 &lt;a href="https://itest2025.pages.dev/idea/" rel="">IntelliJ IDEA&lt;/a> 和 &lt;a href="https://itest2025.pages.dev/maven/" rel="">Maven&lt;/a> ，所以，这里只介绍 Maven 的安装方式。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;lt;!-- https://mvnrepository.com/artifact/org.testng/testng --&amp;gt;
&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;org.testng&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;testng&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;6.13&amp;lt;/version&amp;gt;
 &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1498758536662-35b82cd15e29?w=300"
 data-srcset="https://images.unsplash.com/photo-1498758536662-35b82cd15e29?w=300, https://images.unsplash.com/photo-1498758536662-35b82cd15e29?w=300 1.5x, https://images.unsplash.com/photo-1498758536662-35b82cd15e29?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1498758536662-35b82cd15e29?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（二）第一个测试用例</title><link>https://itest2025.pages.dev/tutorials/36-002-%E4%BA%8C%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B/</link><pubDate>Sat, 25 Nov 2017 12:50:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-002-%E4%BA%8C%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B/</guid><description>&lt;h4 id="第一个测试用例">第一个测试用例&lt;/h4>
&lt;hr>
&lt;p>通过 &lt;a href="https://itest2025.pages.dev/idea/" rel="">IntelliJ IDEA&lt;/a> 创建 FirstTest 测试类。编写如下代码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.annotations.Test&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kn">import static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.AssertJUnit.assertEquals&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">FirstTest&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testCase&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">4&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>通过 &lt;strong>@Test&lt;/strong> 注解一个方法为测试用例。&lt;/li>
&lt;li>通过 &lt;strong>assertEquals()&lt;/strong> 方法来断言两个数是否相等。&lt;/li>
&lt;/ul>
&lt;p>运行测试：&lt;/p>
&lt;pre tabindex="0">&lt;code>===============================================
Default Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
&lt;/code>&lt;/pre>&lt;p>我们先感官上对TestNG使用有一个初步认识。&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1502810190503-8303352d0dd1?w=300"
 data-srcset="https://images.unsplash.com/photo-1502810190503-8303352d0dd1?w=300, https://images.unsplash.com/photo-1502810190503-8303352d0dd1?w=300 1.5x, https://images.unsplash.com/photo-1502810190503-8303352d0dd1?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1502810190503-8303352d0dd1?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（三）TestNG 之 FixTrue</title><link>https://itest2025.pages.dev/tutorials/36-003-%E4%B8%89testng-%E4%B9%8B-fixtrue/</link><pubDate>Sat, 25 Nov 2017 12:45:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-003-%E4%B8%89testng-%E4%B9%8B-fixtrue/</guid><description>&lt;h4 id="什么是fixture">什么是Fixture&lt;/h4>
&lt;hr>
&lt;p>Test Fixture 是指一个测试运行所需的固定环境，准确的定义：&lt;/p>
&lt;blockquote>
&lt;p>The test fixture is everything we need to have in place to exercise the SUT&lt;/p>&lt;/blockquote>
&lt;p>在进行测试时，我们通常需要把环境设置成已知状态（如创建对象、获取资源等）来创建测试，每次测试开始时都处于一个固定的初始状态；测试结果后需要将测试状态还原，所以，测试执行所需要的固定环境称为 Test Fixture。&lt;/p>
&lt;h4 id="testng-提供的-fixture-方法">TestNG 提供的 Fixture 方法&lt;/h4>
&lt;hr>
&lt;p>表：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">注解&lt;/th>
 &lt;th style="text-align: left">说明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">@BeforeSuite&lt;/td>
 &lt;td style="text-align: left">注解的方法在测试套件（中的所有用例）开始前运行一次&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">@AfterSuite&lt;/td>
 &lt;td style="text-align: left">注解的方法在测试套件（中的所有用例）结束后运行一次。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">@BeforeClass&lt;/td>
 &lt;td style="text-align: left">注解的方法在当前测试类（中所有用例）开始前运行一次。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">@AfterClass&lt;/td>
 &lt;td style="text-align: left">注解的方法在当前测试类（中所有用例）结束后运行一次。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">@BeforeTest&lt;/td>
 &lt;td style="text-align: left">对于套件测试，在运行属于&lt;test>标签内的类的所有测试方法之前运行。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">@AfterTest&lt;/td>
 &lt;td style="text-align: left">对于套件测试，在运行属于&lt;test>标签内的类的所有测试方法之后运行。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">@BeforeGroups&lt;/td>
 &lt;td style="text-align: left">在调用属于该组的所有测试方法之前运行。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">@AfterGroups&lt;/td>
 &lt;td style="text-align: left">在调用属于该组的所有测试方法之后运行。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">@BeforeMethod&lt;/td>
 &lt;td style="text-align: left">注解的方法将在每个测试方法之前运行。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">@AfterMethod&lt;/td>
 &lt;td style="text-align: left">注释的方法将在每个测试方法之后执行。&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h4 id="实例">实例&lt;/h4>
&lt;hr>
&lt;p>接下来通过例子演示上面部分注解的用法。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.annotations.*&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">FixtureTest&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">//在当前测试类开始时运行。&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@BeforeClass&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">beforeClass&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">out&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;-------------------beforeClass&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">//在当前测试类结束时运行。&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@AfterClass&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">afterClass&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">out&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;-------------------afterClass&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">//每个测试方法运行之前运行&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@BeforeMethod&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">before&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">out&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;=====beforeMethod&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">//每个测试方法运行之后运行&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@AfterMethod&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">after&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">out&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;=====afterMethod&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testCase1&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">out&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;test case 1&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testCase2&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">out&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;test case 2&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>运行上面的测试，执行结果如下。&lt;/p></description></item><item><title>（四）testng.xml文件解析</title><link>https://itest2025.pages.dev/tutorials/36-004-%E5%9B%9Btestngxml%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90/</link><pubDate>Sat, 25 Nov 2017 12:45:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-004-%E5%9B%9Btestngxml%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90/</guid><description>&lt;p>TestNG 与 Junit 比较大的一个差异就是前者通过 testng.xml 文件来配置测试用例的执行。 testng.xml文件可以很好的控制要执行的测试用例的粒度，及各种运行策略。&lt;/p>
&lt;p>目前testng.xml DTD（Document Type Definition; DTD是一种XML的约束方式。） 配置说明可以在：&lt;a href="http://testng.org/testng-1.0.dtd.php" target="_blank" rel="noopener noreffer ">这里&lt;/a>&lt;/p>
&lt;h4 id="testngmxl-文件解析">testng.mxl 文件解析&lt;/h4>
&lt;hr>
&lt;pre tabindex="0">&lt;code>&amp;lt;suite name=&amp;#34;Suite1&amp;#34; verbose=&amp;#34;1&amp;#34; &amp;gt;
 &amp;lt;test name=&amp;#34;Nopackage&amp;#34; &amp;gt;
 &amp;lt;classes&amp;gt;
 &amp;lt;class name=&amp;#34;NoPackageTest&amp;#34; /&amp;gt;
 &amp;lt;/classes&amp;gt;
 &amp;lt;/test&amp;gt;

 &amp;lt;test name=&amp;#34;Regression1&amp;#34;&amp;gt;
 &amp;lt;classes&amp;gt;
 &amp;lt;class name=&amp;#34;test.sample.ParameterSample&amp;#34;/&amp;gt;
 &amp;lt;class name=&amp;#34;test.sample.ParameterTest&amp;#34;/&amp;gt;
 &amp;lt;/classes&amp;gt;
 &amp;lt;/test&amp;gt;
&amp;lt;/suite&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>&amp;lt;suite&amp;gt;...&amp;lt;/suite&amp;gt;&lt;/code> 表示定义了的一个测试套件。
&lt;ul>
&lt;li>name 定义测试套件的名称。&lt;/li>
&lt;li>verbose 定义命令行信息打印等级，不会影响测试报告输出内容；可选值(1|2|3|4|5) &lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>&amp;lt;test&amp;gt;...&amp;lt;/test&amp;gt;&lt;/code> 表示定义了一个测试。
&lt;ul>
&lt;li>name 定义测试的名称。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>&amp;lt;classes&amp;gt;...&amp;lt;/classes&amp;gt;&lt;/code> 表示定义一组测试类。&lt;/li>
&lt;li>&lt;code>&amp;lt;class .../&amp;gt;&lt;/code> 表示定义一个测试类。
&lt;ul>
&lt;li>name 指定要运行的测试类&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4 id="实例">实例&lt;/h4>
&lt;hr>
&lt;p>测试项目目录结果如下：&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="http://img.testclass.net/testng_project.png"
 data-srcset="http://img.testclass.net/testng_project.png, http://img.testclass.net/testng_project.png 1.5x, http://img.testclass.net/testng_project.png 2x"
 data-sizes="auto"
 alt="http://img.testclass.net/testng_project.png"
 title="http://img.testclass.net/testng_project.png" />&lt;/p>
&lt;p>testng.mxl 配置文件如下：&lt;/p></description></item><item><title>（五）测试级别设置</title><link>https://itest2025.pages.dev/tutorials/36-005-%E4%BA%94%E6%B5%8B%E8%AF%95%E7%BA%A7%E5%88%AB%E8%AE%BE%E7%BD%AE/</link><pubDate>Sat, 25 Nov 2017 12:40:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-005-%E4%BA%94%E6%B5%8B%E8%AF%95%E7%BA%A7%E5%88%AB%E8%AE%BE%E7%BD%AE/</guid><description>&lt;p>在我们创建测试用例时，大概分三个层级。&lt;/p>
&lt;ul>
&lt;li>测试包（目录）&lt;/li>
&lt;li>测试类（文件）&lt;/li>
&lt;li>测试用例（&lt;code>@Test&lt;/code> 注解的方法）&lt;/li>
&lt;/ul>
&lt;p>接下来介绍，如何控制这三个级别用例的执行。当然，核心还是通过 &lt;strong>testng.mxl&lt;/strong> 文件配置。&lt;/p>
&lt;h4 id="指定运行测试包">指定运行测试包&lt;/h4>
&lt;hr>
&lt;pre tabindex="0">&lt;code>&amp;lt;!DOCTYPE suite SYSTEM &amp;#34;http://testng.org/testng-1.0.dtd&amp;#34; &amp;gt;
&amp;lt;suite name=&amp;#34;测试套件&amp;#34; verbose=&amp;#34;1&amp;#34; &amp;gt;
 &amp;lt;test name=&amp;#34;简单测试&amp;#34;&amp;gt;
 &amp;lt;packages&amp;gt;
 &amp;lt;package name=&amp;#34;test.sample&amp;#34; /&amp;gt;
 &amp;lt;package name=&amp;#34;test.sample2&amp;#34; /&amp;gt;
 &amp;lt;/packages&amp;gt;
 &amp;lt;/test&amp;gt;
&amp;lt;/suite&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>&amp;lt;packages&amp;gt;...&amp;lt;/packages&amp;gt;&lt;/code> 定义一组测试包。&lt;/li>
&lt;li>&lt;code>&amp;lt;package.../&amp;gt;&lt;/code> 定义一个测试包。
&lt;ul>
&lt;li>name 指定测试包（目录）的名称。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4 id="指定运行测试类">指定运行测试类&lt;/h4>
&lt;hr>
&lt;pre tabindex="0">&lt;code>&amp;lt;!DOCTYPE suite SYSTEM &amp;#34;http://testng.org/testng-1.0.dtd&amp;#34; &amp;gt;
&amp;lt;suite name=&amp;#34;测试套件&amp;#34; verbose=&amp;#34;1&amp;#34; &amp;gt;
 &amp;lt;test name=&amp;#34;简单测试&amp;#34;&amp;gt;
 &amp;lt;classes&amp;gt;
 &amp;lt;class name=&amp;#34;test.sample.FirstTest&amp;#34;/&amp;gt;
 &amp;lt;class name=&amp;#34;test.sample.SecondTest&amp;#34;/&amp;gt;
 &amp;lt;/classes&amp;gt;
 &amp;lt;/test&amp;gt;
&amp;lt;/suite&amp;gt;
&lt;/code>&lt;/pre>&lt;p>指定测试类的运行，&lt;a href="https://itest2025.pages.dev/testng/testngxml/" rel="">上一节&lt;/a>已经介绍。&lt;/p>
&lt;h4 id="指定运行测试用例">指定运行测试用例&lt;/h4>
&lt;hr>
&lt;pre tabindex="0">&lt;code>&amp;lt;!DOCTYPE suite SYSTEM &amp;#34;http://testng.org/testng-1.0.dtd&amp;#34; &amp;gt;
&amp;lt;suite name=&amp;#34;测试套件&amp;#34; verbose=&amp;#34;1&amp;#34; &amp;gt;
 &amp;lt;test name=&amp;#34;简单测试&amp;#34;&amp;gt;
 &amp;lt;classes&amp;gt;
 &amp;lt;class name=&amp;#34;test.sample.FirstTest&amp;#34;&amp;gt;
 &amp;lt;methods&amp;gt;
 &amp;lt;include name=&amp;#34;testCase&amp;#34; /&amp;gt;
 &amp;lt;/methods&amp;gt;
 &amp;lt;/class&amp;gt;
 &amp;lt;/classes&amp;gt;
 &amp;lt;/test&amp;gt;
&amp;lt;/suite&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>&amp;lt;methods&amp;gt;...&amp;lt;/methods&amp;gt;&lt;/code> 定义一组测试方法。&lt;/li>
&lt;li>&lt;code>&amp;lt;include.../&amp;gt;&lt;/code> 指定包含的测试用例（方法）。
&lt;ul>
&lt;li>name 指定测试用例（方法）的名称。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>注意：&lt;/strong> 测试方法&lt;code>&amp;lt;methods&amp;gt;&lt;/code>必须包含在&lt;code>&amp;lt;class&amp;gt;&lt;/code>标签中。&lt;/p></description></item><item><title>（六）TestNG 用例分组</title><link>https://itest2025.pages.dev/tutorials/36-006-%E5%85%ADtestng-%E7%94%A8%E4%BE%8B%E5%88%86%E7%BB%84/</link><pubDate>Sat, 25 Nov 2017 12:35:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-006-%E5%85%ADtestng-%E7%94%A8%E4%BE%8B%E5%88%86%E7%BB%84/</guid><description>&lt;p>有时候我们的测试用例并不想以测试包、类和用例为单位去运行。测试用例可以有多个纬度去标识。&lt;/p>
&lt;p>例如，可以根据用例的重要程度划分：&lt;/p>
&lt;ul>
&lt;li>重要程度：&lt;strong>低——&amp;gt;中——&amp;gt;高&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>或者，根据用例的类型划分：&lt;/p>
&lt;ul>
&lt;li>类型：&lt;strong>正常——&amp;gt;异常&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>TestNG 允许我们给测试用例贴标签。我们可以根据这些标签有选择地的跳过或执行这些用例。&lt;/p>
&lt;h4 id="实例">实例&lt;/h4>
&lt;hr>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.annotations.Test&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kn">import static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.AssertJUnit.assertEquals&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">groups&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s">&amp;#34;功能测试&amp;#34;&lt;/span>&lt;span class="p">})&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">TagTest&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">groups&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s">&amp;#34;高&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;正常&amp;#34;&lt;/span>&lt;span class="p">})&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testCase1&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">4&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">groups&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s">&amp;#34;高&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;正常&amp;#34;&lt;/span>&lt;span class="p">})&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testCase2&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">5&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">groups&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s">&amp;#34;中&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;正常&amp;#34;&lt;/span>&lt;span class="p">})&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testCase3&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">groups&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s">&amp;#34;低&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;异常&amp;#34;&lt;/span>&lt;span class="p">})&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testCase4&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>接下来配置 &lt;strong>testng.xml&lt;/strong> ，根据标签筛选要运行的测试用例。&lt;/p></description></item><item><title>（七）TestNG 用例执行顺序</title><link>https://itest2025.pages.dev/tutorials/36-007-%E4%B8%83testng-%E7%94%A8%E4%BE%8B%E6%89%A7%E8%A1%8C%E9%A1%BA%E5%BA%8F/</link><pubDate>Sat, 25 Nov 2017 12:30:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-007-%E4%B8%83testng-%E7%94%A8%E4%BE%8B%E6%89%A7%E8%A1%8C%E9%A1%BA%E5%BA%8F/</guid><description>&lt;p>有时候，我们希望用例按照我们要求的顺序来执行。TestNG 同样可以满足这一点要求。&lt;/p>
&lt;h4 id="实例">实例&lt;/h4>
&lt;hr>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Java" data-lang="Java">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.annotations.Test&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kn">import static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.AssertJUnit.assertEquals&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">CaseRunTest&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testCase1&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">4&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testCase2&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">4&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testCase3&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">4&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通过 &lt;strong>testng.xml&lt;/strong> 文件修改配置。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;lt;!DOCTYPE suite SYSTEM &amp;#34;http://testng.org/testng-1.0.dtd&amp;#34; &amp;gt;
&amp;lt;suite name=&amp;#34;测试套件&amp;#34;&amp;gt;
 &amp;lt;test name=&amp;#34;简单测试&amp;#34; preserve-order=&amp;#34;false&amp;#34;&amp;gt;
 &amp;lt;classes&amp;gt;
 &amp;lt;class name=&amp;#34;test.sample.CaseRunTest&amp;#34;&amp;gt;
 &amp;lt;methods&amp;gt;
 &amp;lt;include name=&amp;#34;testCase3&amp;#34; /&amp;gt;
 &amp;lt;include name=&amp;#34;testCase1&amp;#34; /&amp;gt;
 &amp;lt;include name=&amp;#34;testCase2&amp;#34; /&amp;gt;
 &amp;lt;/methods&amp;gt;
 &amp;lt;/class&amp;gt;
 &amp;lt;/classes&amp;gt;
 &amp;lt;/test&amp;gt;
&amp;lt;/suite&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>preserve-order 参数用于控制测试用例的执行顺序。如果为：&lt;strong>true&lt;/strong>，测试用例的顺序为：testCase &amp;gt; testCase1 &amp;gt; testCase2。如果为:&lt;strong>false&lt;/strong> ，那么默认会按照用例的名称的有字母/数字的顺序执行：testCase1 &amp;gt; testCase2 &amp;gt; testCase3。&lt;/li>
&lt;/ul>
&lt;p>不设置的情况下默认为 &lt;strong>true&lt;/strong> 。&lt;/p></description></item><item><title>（八）TestNG 用例依赖</title><link>https://itest2025.pages.dev/tutorials/36-008-%E5%85%ABtestng-%E7%94%A8%E4%BE%8B%E4%BE%9D%E8%B5%96/</link><pubDate>Sat, 25 Nov 2017 12:25:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-008-%E5%85%ABtestng-%E7%94%A8%E4%BE%8B%E4%BE%9D%E8%B5%96/</guid><description>&lt;p>当某一条用例运行失败时，其它用例必然也会失败，所以，我们就没有必要再运行其它用例了，这个时候我们就可以设置用例之间的依赖。&lt;/p>
&lt;h4 id="测试方法依赖">测试方法依赖&lt;/h4>
&lt;hr>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.annotations.Test&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kn">import static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.AssertJUnit.assertEquals&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">DependentMethodsTest&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testAdd1&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">3&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">5&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dependsOnMethods&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s">&amp;#34;testAdd1&amp;#34;&lt;/span>&lt;span class="p">})&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testAdd2&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">3&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">5&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>dependsOnMethods 来设置用例的依赖，当 testAdd1() 运行失败时，则 testAdd2() 不再被执行。&lt;/li>
&lt;/ul>
&lt;h4 id="测试组依赖">测试组依赖&lt;/h4>
&lt;hr>
&lt;pre tabindex="0">&lt;code>import org.testng.annotations.Test;
import static org.testng.AssertJUnit.assertEquals;


public class DependentGroupsTest {

 @Test(groups={&amp;#34;funtest&amp;#34;})
 public void testAdd1(){
 assertEquals(3+1, 5);
 }

 @Test(groups={&amp;#34;funtest&amp;#34;})
 public void testAdd2(){
 assertEquals(3+2, 5);
 }

 @Test(dependsOnGroups = {&amp;#34;funtest&amp;#34;})
 public void testAdd3(){
 assertEquals(3+2, 5);
 }

}
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>dependsOnGroups 来设置组的依赖，testAdd1()和 testAdd2() 同属于于 funtest组，testAdd3() 依赖于funtest组，该组有中有一条用例运行失败，则testAdd3() 不再执行。&lt;/li>
&lt;/ul>
&lt;p>原始封面&lt;/p></description></item><item><title>（九）TestNG 用例参数化</title><link>https://itest2025.pages.dev/tutorials/36-009-%E4%B9%9Dtestng-%E7%94%A8%E4%BE%8B%E5%8F%82%E6%95%B0%E5%8C%96/</link><pubDate>Sat, 25 Nov 2017 12:20:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-009-%E4%B9%9Dtestng-%E7%94%A8%E4%BE%8B%E5%8F%82%E6%95%B0%E5%8C%96/</guid><description>&lt;p>参数化也测试用例中常用的技巧之一，它可以增加用例的可配置性和减少相同用例的编写。&lt;/p>
&lt;h4 id="通过-parameters-实现参数化">通过 @Parameters 实现参数化&lt;/h4>
&lt;hr>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.annotations.Parameters&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.annotations.Test&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kn">import static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.AssertJUnit.assertEquals&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">DataProviderTest&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Parameters&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s">&amp;#34;add1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;add2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;result&amp;#34;&lt;/span>&lt;span class="p">})&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testAdd1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">add1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">add2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">add1&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">add2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>@Parameters 获取参数化数据，作为 testAdd1() 测试方法的参数。&lt;/li>
&lt;/ul>
&lt;p>具体的测试数据在 &lt;strong>testng.mxl&lt;/strong> 文件中设置。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;lt;!DOCTYPE suite SYSTEM &amp;#34;http://testng.org/testng-1.0.dtd&amp;#34; &amp;gt;
&amp;lt;suite name=&amp;#34;测试套件&amp;#34;&amp;gt;
 &amp;lt;test name=&amp;#34;简单测试&amp;#34;&amp;gt;
 &amp;lt;parameter name=&amp;#34;add1&amp;#34; value=&amp;#34;3&amp;#34;/&amp;gt;
 &amp;lt;parameter name=&amp;#34;add2&amp;#34; value=&amp;#34;2&amp;#34;/&amp;gt;
 &amp;lt;parameter name=&amp;#34;result&amp;#34; value=&amp;#34;5&amp;#34;/&amp;gt;
 &amp;lt;classes&amp;gt;
 &amp;lt;class name=&amp;#34;test.sample.DataProviderTest&amp;#34; /&amp;gt;
 &amp;lt;/classes&amp;gt;
 &amp;lt;/test&amp;gt;
&amp;lt;/suite&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>&lt;code>&amp;lt;parameter.../&amp;gt;&lt;/code> 定义测试数据&lt;/li>
&lt;li>name 定义数据的名字，在测试用例中通过该名字来获取对应的vlaue。&lt;/li>
&lt;li>value 定义测试数据，通过对应的name来获取该值。&lt;/li>
&lt;/ul>
&lt;h4 id="通过-dataprovider-实现参数化">通过 @DataProvider 实现参数化&lt;/h4>
&lt;hr>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.annotations.DataProvider&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.annotations.Test&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kn">import static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.testng.AssertJUnit.assertEquals&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">DataProviderTest&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// 定义对象数组&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@DataProvider&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;add&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Object&lt;/span>&lt;span class="o">[][]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">Users&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Object&lt;/span>&lt;span class="o">[][]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">5&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">},&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">},&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">3&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">7&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">},&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">};&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dataProvider&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;add&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">testAdd2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">add1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">add2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">assertEquals&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">add1&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="n">add2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>@DataProvider 定义对象数组，数组的名称为：add 。&lt;/li>
&lt;/ul>
&lt;p>在 testAdd2() 中通过 &lt;code>dataProvider=&amp;quot;add&amp;quot;&lt;/code> 调用定义的对象数组，并通过参数获取相应的测试数据。&lt;/p></description></item><item><title>（十） TestNG 多线程运行用例</title><link>https://itest2025.pages.dev/tutorials/36-010-%E5%8D%81-testng-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%BF%90%E8%A1%8C%E7%94%A8%E4%BE%8B/</link><pubDate>Sat, 25 Nov 2017 12:15:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-010-%E5%8D%81-testng-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%BF%90%E8%A1%8C%E7%94%A8%E4%BE%8B/</guid><description>&lt;p>TestNG 是我接触过的唯一自身支持多程技术的单元测试框架。虽然代码级别的单元测试运行得很快，多线程的意义并不大。但如果是UI自动化测试的话运行速度就会非常慢，这个时候多线程技术就会变得很重要。&lt;/p>
&lt;h4 id="多线程配置">多线程配置&lt;/h4>
&lt;hr>
&lt;p>这里只介绍 &lt;strong>testng.xml&lt;/strong> 文件，其中的使用到的测试用例，请参考前面的章节创建。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;lt;!DOCTYPE suite SYSTEM &amp;#34;http://testng.org/testng-1.0.dtd&amp;#34; &amp;gt;
&amp;lt;suite name=&amp;#34;测试套件&amp;#34; parallel=&amp;#34;classes&amp;#34; thread-count=&amp;#34;2&amp;#34; &amp;gt;
 &amp;lt;test name=&amp;#34;简单测试&amp;#34;&amp;gt;
 &amp;lt;classes&amp;gt;
 &amp;lt;class name=&amp;#34;test.sample.FirstTest&amp;#34; /&amp;gt;
 &amp;lt;class name=&amp;#34;test.sample.SecondTest&amp;#34; /&amp;gt;
 &amp;lt;/classes&amp;gt;
 &amp;lt;/test&amp;gt;
&amp;lt;/suite&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>
&lt;p>parallel 设置多线程的级别划分。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>parallel=&amp;ldquo;methods&amp;rdquo;: TestNG将在不同的线程中运行所有的测试方法。依赖方法也将在单独的线程中运行，但它们将尊重你指定的顺序。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>parallel=&amp;ldquo;tests&amp;rdquo;: TestNG 将在同一个线程中运行相同的&lt;test>标记的所有方法，但是每个&lt;test>标记将在一个单独的线程中。这允许你将所有非线程安全的类分组在同一个&lt;test>中，并保证它们将在同一个线程中运行，同时利用尽可能多的线程来运行测试。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>parallel=&amp;ldquo;classes&amp;rdquo;: TestNG将在同一个线程中运行同一个类中的所有方法，但是每个类都将在一个单独的线程中运行。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>parallel=&amp;ldquo;instances&amp;rdquo;: TestNG将在同一个线程中运行相同实例中的所有方法，但是在两个不同实例上的两个方法将在不同的线程中运行。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>thread-count 用于指定线程的个数。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1517048676732-d65bc937f952?w=300"
 data-srcset="https://images.unsplash.com/photo-1517048676732-d65bc937f952?w=300, https://images.unsplash.com/photo-1517048676732-d65bc937f952?w=300 1.5x, https://images.unsplash.com/photo-1517048676732-d65bc937f952?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1517048676732-d65bc937f952?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（十一）TestNG 其他使用技巧</title><link>https://itest2025.pages.dev/tutorials/36-011-%E5%8D%81%E4%B8%80testng-%E5%85%B6%E4%BB%96%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</link><pubDate>Sat, 25 Nov 2017 12:10:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-011-%E5%8D%81%E4%B8%80testng-%E5%85%B6%E4%BB%96%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</guid><description>&lt;p>除了前面介绍的功能外，TestNG 还有一些使用技巧，相对比较简单，这里通过一个例子来演示。&lt;/p>
&lt;h4 id="其它使用技巧">其它使用技巧&lt;/h4>
&lt;hr>
&lt;pre tabindex="0">&lt;code>import org.testng.annotations.Test;
import static org.testng.AssertJUnit.assertEquals;


public class OtherTest {

 // 该条用例跳过执行
 @Test(enabled = false)
 public void testCase1(){
 assertEquals(2+2, 4);
 }

 // 设定用例超时时间
 @Test(timeOut = 3000)
 public void testCase2() throws InterruptedException {
 Thread.sleep(3001);
 }

 // 预设用例抛出的异常类型
 @Test(expectedExceptions = RuntimeException.class)
 public void testCase3(){
 assertEquals(2/0,1);
 }

}
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>
&lt;p>enabled 设置用例是否跳过执行，默认为：&lt;strong>true&lt;/strong> ，表示不跳过。&lt;strong>false&lt;/strong> 表示跳过执行。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>timeOut 设置用例运行的超时间，3000 单位为毫秒，当用例运行时间超过 3000 毫秒则判定为失败。不管用例本身是否运行失败。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>expectedExceptions 用来预设用例运行会出现的异常。例如 2/0 将会抛出 RuntimeException 类型的异常，如果出现异常则表示用例执行成功。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1515965885361-f1e0095517ea?w=300"
 data-srcset="https://images.unsplash.com/photo-1515965885361-f1e0095517ea?w=300, https://images.unsplash.com/photo-1515965885361-f1e0095517ea?w=300 1.5x, https://images.unsplash.com/photo-1515965885361-f1e0095517ea?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1515965885361-f1e0095517ea?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（十二）TestNG 生成测试报告</title><link>https://itest2025.pages.dev/tutorials/36-012-%E5%8D%81%E4%BA%8Ctestng-%E7%94%9F%E6%88%90%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A/</link><pubDate>Sat, 25 Nov 2017 12:10:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/36-012-%E5%8D%81%E4%BA%8Ctestng-%E7%94%9F%E6%88%90%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A/</guid><description>&lt;p>TestNG 默认自带的有HTML格式的测试报告。这也充分说明拿它来做 UI 自动化测试的优势。&lt;/p>
&lt;h4 id="通过-maven-生成报告">通过 Maven 生成报告&lt;/h4>
&lt;hr>
&lt;p>切换到 &lt;strong>TestngTest&lt;/strong> 项目的跟目录下，通过 &lt;code>mvn test&lt;/code> 命令运行测试。&lt;/p>
&lt;pre tabindex="0">&lt;code>TestngTest&amp;gt; mvn test

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building TestngTest 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ TestngTest
 --- [WARNING] Using platform encoding (GBK actually) to copy filtered resources,
 i.e. build is platform dependent!
[INFO] Copying 0 resource

...

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running TestSuite
Configuring TestNG with: org.apache.maven.surefire.testng.conf.TestNG652Configurator@104e3b2
Tests run: 19, Failures: 5, Errors: 0, Skipped: 2, Time elapsed: 3.862 sec &amp;lt;&amp;lt;&amp;lt; FAILURE!
&lt;/code>&lt;/pre>&lt;p>在该系列教程开始前，我已经说明了整个项目基于 &lt;a href="https://itest2025.pages.dev/maven/" rel="">Maven&lt;/a> 创建。&lt;/p></description></item></channel></rss>