`
longgangbai
  • 浏览: 7331895 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

TestNG简单的学习(六)测试工厂注释的使用

阅读更多

TestNG官方网站:

http://testng.org/doc/documentation-main.html

 

官方文档:

5.8 - Factories

Factories allow you to create tests dynamically. For example, imagine you want to create a test method that will access a page on a Web site several times, and you want to invoke it with different values:

TestWebServer.java

 

 
public class TestWebServer {
  @Test(parameters = {
"number-of-times" })
  public void accessPage(int numberOfTimes) {
    while (numberOfTimes-- >
0) {
     //
access the web page
    }
  }
}

 

testng.xml

 

 
<test name="T1">
  <parameter name="number-of-times" value="10"/>
  <class name= "TestWebServer" />
</test>
 
<test name="T2">
  <parameter name="number-of-times" value="20"/>
  <class name= "TestWebServer"/>
</test>
 
<test name="T3">
  <parameter name="number-of-times" value="30"/>
  <class name= "TestWebServer"/>
</test>

This can become quickly impossible to manage, so instead, you should use a factory:

WebTestFactory.java

 

 
public class WebTestFactory {
  @Factory
  public Object[]
createInstances() {
   Object[]
result =
new Object[10];  
   for (int i = 0; i < 10; i++) {
      result[i] = new WebTest(i * 10);
    }
    return result;
  }
}

and the new test class is now:

WebTest.java

 

 
public class WebTest {
  private int m_numberOfTimes;
  public WebTest(int numberOfTimes) {
    m_numberOfTimes = numberOfTimes;
  }
 
  @Test
  public void testServer() {
   for (int i = 0; i < m_numberOfTimes;
i++) {
     //
access the web page
    }
  }
}

 

Your testng.xml only needs to reference the class that contains the factory method, since the test instances themselves will be created at runtime:

 

 
<class name="WebTestFactory" />

 

The factory method can receive parameters just like @Test and @Before/After and it must return Object[]. The objects returned can be of any class (not necessarily the same class as the factory class) and they don't even need to contain TestNG annotations (in which case they will be ignored by TestNG).

 

Factories can also be used with data providers, and you can leverage this functionality by putting the @Factory annotation either on a regular method or on a constructor. Here is an example of a constructor factory:

 

 
@Factory(dataProvider = "dp")
public FactoryDataProviderSampleTest(int n) {
  super(n);
}
@DataProvider
static public Object[][] dp() {
  return new Object[][] {
    new Object[] { 41 },
    new Object[] { 42 },
  };
}

The example will make TestNG create two test classes, on with the constructor invoked with the value 41 and the other with 42.

 

 

 

如果一个测试类的很多方法需要测试,而且这个测试类需要多次测试那么需要使用测试工厂最好。

package com.easyway.testng;

import org.testng.annotations.Test;

/**
 * @author longgangbai
 * 2013-11-19  下午3:02:43
 *
 */
public class WebTest {  

	  private int m_numberOfTimes;  

	  public WebTest(int numberOfTimes) {  

	    m_numberOfTimes = numberOfTimes;  

	  }  

	   

	  @Test 

	  public void testServer() {  

	   for (int i = 0; i < m_numberOfTimes; i++) {  
	    }  

	  }  

	} 

 

制定测试类运行10次:

package com.easyway.testng;

import org.testng.annotations.Factory;

/**
 * @author longgangbai
 * 2013-11-19  下午3:02:21
 *
 */
public class WebTestFactory {  

	  @Factory 
	  public Object[] createInstances() {  

	   Object[] result = new Object[10];    

	   for (int i = 0; i < 10; i++) {  

	      result[i] = new WebTest(i * 10);  

	    }  

	    return result;  

	  }  

	} 

 如果想通过配置制定测试类运行10次:

可以将测试工厂类改写为:

package com.easyway.testng;

import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;

/**
 * @author longgangbai
 * 2013-11-19  下午3:04:41
 *
 */
public class WebTestConstructFactory {
	@Factory(dataProvider = "dp")  
	public Object[]  createFactory(int n) {  
		   Object[] result = new Object[n];    
		   for (int i = 0; i < n; i++) {  
		      result[i] = new WebTest(i * n);  
		    }  
		   return result;  
	}  
	@DataProvider(name = "dp" ,parallel=true)  
	static public Object[][] dp() {  
	  return new Object[][] {  
	    new Object[] { 41 },  
	    new Object[] { 42 },  
	  };  

	} 

}

 

分享到:
评论

相关推荐

    清华大学java教程(注释很详细)

    13. **单元测试**:学习JUnit或TestNG等单元测试框架,编写测试用例,确保代码的质量和稳定性。 清华大学的Java教程会深入讲解这些知识点,并通过实例和练习帮助学习者巩固理解。注释丰富的代码示例有助于读者更好...

    Java学习资料(高级应用)

    10. **测试**:单元测试(JUnit)、集成测试(TestNG)和Mockito等工具的使用,确保代码质量并简化调试过程。 11. **Javadoc与源码阅读**:学习编写清晰的Javadoc注释,以及如何阅读和理解开源库的源码,对于成为...

    编程爱好者博客地带.zip项目JAVA源码+资料打包下载

    8. **单元测试**:Java中的JUnit或TestNG可能被用来编写测试用例,确保代码的正确性。学习者可以学习如何编写和执行单元测试,理解测试驱动开发(TDD)的重要性。 9. **设计模式**:项目可能运用了多种设计模式,如...

    JAVA的编码规范标准,

    - 写单元测试来验证代码功能,使用JUnit或TestNG框架。 - 测试覆盖率应尽可能高,确保代码质量。 通过遵循这些编码规范,可以提升代码的整体质量,使得代码更易于阅读、理解和维护。在实际开发中,团队应制定统一...

    java编码规范

    - 使用JUnit或TestNG等测试框架进行自动化测试。 10. **持续集成和代码审查** - 实施持续集成(CI),确保代码质量并及时发现潜在问题。 - 进行代码审查,团队成员互相检查代码,共同提高代码质量。 以上就是Java...

    JAVA开发之学习代码技巧基础.pdf

    14. **单元测试**:使用JUnit或TestNG编写单元测试,确保代码功能正确,并为持续集成打下基础。 15. **代码重构**:定期进行代码重构,提高代码的可读性和可维护性,遵循SOLID原则。 以上只是Java开发中的一些基本...

    Java编码规则

    13. **单元测试**:编写单元测试用例来验证代码功能,使用JUnit或TestNG等工具。 14. **代码审查**:定期进行代码审查,确保遵循编码规范,并发现潜在的错误和改进点。 15. **持续集成/持续部署(CI/CD)**:利用...

    JavaCoding编码规范(写规范的代码,做规矩的程序员)

    - 使用JUnit或TestNG等测试框架进行测试。 8. **版本控制** - 使用Git进行版本控制,遵循提交和合并的最佳实践。 - 编写有意义的提交信息,保持代码历史清晰。 9. **持续集成/持续部署(CI/CD)** - 配置自动化...

    真实的项目源码!

    此外,商业项目源码还可能涉及到权限控制(如Spring Security)、用户认证(OAuth2)、日志记录(Log4j或Logback)、单元测试(JUnit或TestNG)、任务调度(Quartz或Spring Task)等常见的企业级功能。这些组件和...

    java项目开发10例源代码

    8. **单元测试与持续集成**:如果项目包含测试代码,那么你可以学习如何使用JUnit或TestNG进行单元测试,以及如何配置Maven或Gradle进行持续集成,这些都是现代开发流程的重要组成部分。 9. **版本控制与协作**:...

    Java语言编程规范--华为技术有限公司

    - 使用JUnit或TestNG等工具进行测试,遵循 Arrange-Act-Assert 结构。 10. **代码审查**: - 定期进行代码审查,发现潜在问题,提升代码质量。 - 使用代码质量管理工具,如SonarQube,进行自动化检查。 以上仅...

    编写高质量代码 改善Java程序的151个建议 PDF高清完整版

    10. **单元测试**:强调编写单元测试的重要性,使用JUnit或TestNG等工具,确保代码覆盖率,遵循TDD(测试驱动开发)原则。 11. **持续集成与版本控制**:推荐使用Git进行版本控制,采用持续集成工具如Jenkins,确保...

    阿里巴巴Java开发手册(详尽版).zip

    - 测试方法:使用JUnit或TestNG等测试框架,编写可读性强、易于维护的测试用例。 - 测试驱动开发:提倡TDD(Test-Driven Development),先写测试后写实现。 7. **其他** - SQL优化:编写高效的SQL语句,避免全...

    JMock JARs+docs

    JMock可以与多种测试框架集成,如JUnit、TestNG等,也可以与其他模拟库如EasyMock、Mockito配合使用,以满足不同测试需求。 总之,JMock是Java开发者进行单元测试的重要工具,它通过提供模拟和预期机制,帮助确保...

    一些Java编码规范(仅供参考)

    - 编写单元测试,确保代码的功能正确,如使用JUnit或TestNG框架。 - 测试覆盖率应尽可能高,涵盖各种边界条件和异常情况。 13. **持续集成与自动化** - 使用持续集成工具(如Jenkins、Travis CI)自动构建和测试...

    SimpleTimeKeeper-源码.rar

    Junit或TestNG等测试框架的使用将帮助开发者进行这些测试。此外,日志记录(Logging)框架如Log4j或java.util.logging可能被用来记录运行时信息,方便调试。 7. **错误处理和异常处理**:源码中应有适当的错误处理...

    大一java期末大作业项目课程设计

    13. **测试**: 学生应学习单元测试,可以使用JUnit或TestNG框架来编写测试用例,确保代码功能的正确性。 14. **文档编写**: 学生需要编写项目文档,包括需求分析、系统设计、使用手册等,提高项目的专业性和可读性...

    阿里巴巴Java开发手册V1.6(泰山版).zip

    在测试方面,手册强调单元测试的重要性,推荐使用Mockito等工具进行模拟测试,以及JUnit和TestNG作为测试框架。同时,提倡编写可测试的代码,避免依赖全局状态和静态方法。 最后,手册还涉及了代码审查和持续集成的...

    软件开发文档范例.zip

    5. **单元测试**:在Java开发中,JUnit或TestNG通常用于编写单元测试,确保每个模块的功能正确。测试用例和测试报告也应作为文档的一部分。 6. **集成测试与系统测试**:描述如何将各个组件整合并进行系统级别的...

    java开源辞典

    JUnit或TestNG可能是项目中使用的测试框架,通过测试用例覆盖功能点,确保软件功能的可靠性。 8. **版本控制**:开源项目通常使用Git进行版本控制,因此,通过查看项目历史,开发者可以了解如何利用Git进行协同开发...

Global site tag (gtag.js) - Google Analytics