为Java应用程序编写数据驱动的测试

JUnit是一个功能非常强大的测试框架,它不仅为其用户提供了编写快速简便的测试的功能,而且还为用户提供了扩展它并使其按其期望的方式工作的机会。 在JUnit之上构建了许多框架,这些框架为目标受众提供了各种易用的功能。

EasyTest是这样一种框架,其主要重点是将数据驱动测试功能引入JUnit世界。

JUnit已经有了某种机制,可以为用户提供某种数据驱动的测试感觉。 但是它还不够,也不干净。 例如,用户可以使用@Parameterized Runner编写数据驱动测试,但使用Parameterized Runner会导致编写许多不必要的代码。

EasyTest试图通过弥合JUnit已经拥有的与用户最方便的之间的差距来解决这些问题。

在今天的帖子中,我将简要介绍一下EasyTest是什么以及它如何从一种业余爱好演变为一个成熟的项目,该项目已被许多公司和许多人使用。

入门

为了开始使用EasyTest,您要做的就是下载JAR文件。 您可以通过Maven做到这一点。 这是 Maven上最新的easytest-core JAR 的链接

下载JAR文件后,就可以编写第一个数据驱动测试了。 这是使用EasyTest Core Module快速启动和运行的分步指南。

步骤1 :您的pom文件中具有最新的EasyTest依赖项:

<dependency>
<groupId>org.easetech</groupId>
<artifactId>easytest-core</artifactId>
<version>1.3.2</version>
</dependency>

步骤2 :使用测试方法创建一个简单的测试类

@RunWith(DataDrivenTestRunner.class)
    @DataLoader(filePaths = { "testExcelData.xls" })
    public class TestExcelDataLoader{
    
      private ItemService itemService = new RealItemService();

    @Test
    public void getExcelTestData(@Param(name="libraryId")
    Float libraryId, @Param(name="itemId")
    Float itemId) {
        System.out.print("Executing getExcelTestData :");
        System.out.println("LibraryId is :" + libraryId + " and Item Id is :" + itemId);
    }

EasyTest库提供了许多选项,可用于有效执行测试。 例如,如果您要并行执行测试,则EasyTest提供并行注释。 查看此博客文章,以详细了解并行注释

这是另一个利用EasyTest中可用功能的详细示例:

@RunWith(DataDrivenTestRunner.class)
    @DataLoader(filePaths = { "testExcelData.xls" })
    @Format(date='dd/MM/yyyy')
    @Report
    @Parallel(threads=5)
    public class TestExcelDataLoader{
    
      @Duration(timeInMillis=1000)
      private ItemService itemService = new RealItemService();

    @Test
    public void getExcelTestData(@Param(name="libraryId")
    Float libraryId, @Param(name="itemId")
    Float itemId) {
        System.out.print("Executing getExcelTestData :");
        System.out.println("LibraryId is :" + libraryId + " and Item Id is :" + itemId);
    }

您可以查看源代码的javadocs,以了解每种注释的含义,还可以了解EasyTest中可用的功能。

在每个测试类上编写带有如此多注释的测试类不仅耗时(典型的样板代码),而且还会引入难以跟踪的错误。 因此,Easytest为您提供了一次定义和随处使用功能的能力。 看下面的示例,与上面的示例相同,但更简洁:

另外,您可以在类级别使用TestPolicy批注将所有批注移动到单独的可重用测试策略类。 这是一个例子。

@RunWith(DataDrivenTestRunner.class)
    @TestPolicy(TestExcelDataPolicy.class)
    public class TestExcelDataLoader{
    
      @Duration(timeInMillis=1000)
      private ItemService itemService = new RealItemService();

    @Test
    public void getExcelTestData(@Param(name="libraryId")
    Float libraryId, @Param(name="itemId")
    Float itemId) {
        System.out.print("Executing getExcelTestData :");
        System.out.println("LibraryId is :" + libraryId + " and Item Id is :" + itemId);
    }

在这里,我们没有定义测试类的几个注释,而是定义了一个TestPolicy Annotation ,它从测试类中抽象出了复杂的定义。

这是Policy类TestExcelDataPolicy样子:

@DataLoader(filePaths = { "org/example/data/testExcelData.xls" })
     @Format(date='dd/MM/yyyy')
     @Report
     @Parallel(threads=5)
     public class TestExcelDataPolicy {
         
     }

具有这样的抽象意味着现在您可以在多个测试中重用您的测试策略类,从而大大减少了样板代码。

定义测试类后,下一步就是定义测试数据文件。

步骤3 :创建您的测试数据文件(对于上面的示例,这将是一个名为testExcelData.xls的Excel文件)
第一行的第一列表示需要为其提供数据的测试方法的名称。 第一行的第二和第三列代表测试输入参数的名称。 第2和3行代表实际测试数据。

getExcelTestData itemId libraryId

                         11567 91475

                          null         0

恭喜你 您刚刚编写了第一个数据驱动测试。 当使用Junit支持的IDE运行上述测试时,EasyTest将生成2个测试,每组数据一个。 这样,您就不必编写用于使用不同参数进行测试的不同测试。

接下来,让我们扩展该示例,并尝试了解EasyTest的一些其他功能

了解EasyTest中的IoC容器支持

除了在测试类本身中定义/初始化testSubject(上述测试中的ItemService)之外,您还可以在配置文件中外部化初始化逻辑并在运行时注入正确的实例。 这样做的好处是,您可以将初始化逻辑与测试逻辑分开,从而使您的测试更简洁,更可维护。 其次,您也可以在其他测试中重用外部化的逻辑。 让我们看看如何为上述测试做到这一点。

@RunWith(DataDrivenTestRunner.class)
    @DataLoader(filePaths = { "testExcelData.xls" })
    @TestConfigProvider({TestConfigProviderClass.class})
    public class TestExcelDataLoader{
    
      @Inject
      private ItemService itemService;

    @Test
    public void getExcelTestData(@Param(name="libraryId")
    Float libraryId, @Param(name="itemId")
    Float itemId) {
        System.out.print("Executing getExcelTestData :");
        System.out.println("LibraryId is :" + libraryId + " and Item Id is :" + itemId);
    }

请注意,我们在上述测试中添加了两件事:

  1. TestConfigProvider批注
  2. 注入注解

TestConfigProvider批注采用一组配置提供程序类,从这些类可以加载Bean。 在上面的示例中,TestConfigProviderClass.class将如下所示:

public class TestConfigProviderClass {
    
    @TestBean public ItemService itemService(){
        return new RealItemService();
    }

还要注意,我们使用标准Javax批注@Inject来注入测试Bean。 EASYTEST支持@Inject按类型,注射@Named沿@Inject按名称注射。 除此之外,EasyTest还支持按字段名称进行注入。 EASYTEST也有自己的@Provided当用户没有或不能使用javax注释的情况下的注释。

到此博客帖子结束了。 希望我能给您有趣的EasyTest及其功能介绍。 如果您有任何疑问或疑问或想为该项目做出贡献,请通过anujkumar@easetech.org与我联系。

翻译自: https://www.javacodegeeks.com/2015/08/writing-data-driven-tests-for-your-java-application.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值