标签: testng-dataprovider

如何使用Mockito TestNG在数据提供程序中传递模拟对象?

我试图通过数据提供程序将模拟对象传递给测试方法.以下是我的测试类:

@Test
public class FirstTest {
@InjectMocks
First firstSpy;

@Mock
Second secondMock;

@Mock
Third thirdMock;

@BeforeMethod
public void beforeMethod() {
    firstSpy = Mockito.spy(new First());
    MockitoAnnotations.initMocks(this);

}

@DataProvider
private final Object[][] serviceData() {
    return new Object [][] {
        {thirdMock, 1},
        {null, 2}
    };
}

@Test(dataProvider="serviceData")
public void m1(Third thirdObject, int noOfTimesm3Called) {
  Mockito.doReturn(secondMock).when(firstSpy).m4();
  Mockito.doReturn(thirdObject).when(secondMock).m2();
  firstSpy.m1();
  verify(firstSpy, times(noOfTimesm3Called)).m3();
}
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,它会显示出来

PASSED: m1(null, 2)
FAILED: m1(null, 1) 
Run Code Online (Sandbox Code Playgroud)

这意味着传递空对象的两次.这背后的原因是什么?我怎样才能获得理想的行为?我想避免测试方法中的任何if-else语句,并希望使用数据提供程序在同一方法中测试这两种情况.有办法吗?

java testng unit-testing mockito testng-dataprovider

7
推荐指数
1
解决办法
3693
查看次数

如何将 TestNG @DataProvider 迁移到 JUnit Jupiter @ParameterizedTest

我使用 TestNG 进行单元测试,并尝试将其迁移到 JUnit Jupiter (JUnit 5),我想知道哪种方法是最好的:

测试NG

@DataProvider
public Object[][] invalidPortNumbers() {
    return new Object[][] {
            { "--http", "" },
            { "--http", "-42" },
            { "--http", "0" },
            { "--http", "not_a_port_number" },
            { "--https", "67000" }
    };
}

@Test(dataProvider = "invalidPortNumbers",
      expectedExceptions = ParameterException.class,
      expectedExceptionsMessageRegExp = ".* is not valid port number .*")
public void shouldFailToValidatePortNumber(final String... args) {
    new CommandLineParser(args);
}
Run Code Online (Sandbox Code Playgroud)

我看到迁移到JUnit Jupiter,我可以这样做:

static Stream<Arguments> invalidPortNumbers2() {
    return Stream.of(
            Arguments.of((Object) new String[] { "--http", "-42" …
Run Code Online (Sandbox Code Playgroud)

testng testng-dataprovider junit5 junit-jupiter

7
推荐指数
1
解决办法
5902
查看次数

TestNG @Test(invocationCount = 20) to a Class with @Test(DataProvider="someList") to a Method

我有一个 JAVA 项目的 TestNG 测试套装,在那里我有一个

@Test(DataProvider="ListOfObjects")注释方法。它提供了大约 20 行数据的方法。(因此该方法运行了 20 次。)现在,我想运行这个类2 小时(SOAK 相关测试的一部分)。平均而言,该类单次运行需要大约 10 分钟。所以我想或运行整个班级 12 次,因此考虑在 Class 本身上使用@Test(invocationCount = 20)。任何更好的想法?

java testing testng testng-dataprovider

5
推荐指数
1
解决办法
524
查看次数

在 JUnit 中参数化测试方法,而不仅仅是整个类

我想在 JUnit 中创建一个数据驱动的参数化方法

我看到的例子对整个进行了参数化。

例如

@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {
Run Code Online (Sandbox Code Playgroud)

但是,我想参数化单个测试方法,而不是整个

在 TestNG 中,类似的东西看起来像这样:

@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
   return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}};
}

// This test will run 4 times since we have 5 parameters defined
@Test(dataProvider = "test1")
public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
   System.out.println(inputNumber + " " + expectedResult);
   Assert.assertEquals(expectedResult,
   primeNumberChecker.validate(inputNumber));
}
Run Code Online (Sandbox Code Playgroud)

JUnit 中可能有这样的事情吗?

编辑:

  1. 最优雅/干燥的方法是使用单个方法级注释 …

java junit testng data-driven-tests testng-dataprovider

5
推荐指数
1
解决办法
3191
查看次数

无法返回 @dataProvider PHPUnit 中的对象

是否允许从@dataProviders测试方法返回对象?

public function iOsMessages()
{
    return [
        'update available'        => [1, new UpToDateMessage(), 'pl'],
    ];
}

/**
 * @test
 * @dataProvider iOsMessages
 */
public function success_create_message_for_ios(int $appVersion, MobileMessage $message, string $locale)
{
(...)
Run Code Online (Sandbox Code Playgroud)

错误:

为 Tests\Tests\Mobile\Classes\AppVersionTest::success_create_message_for_ios 指定的数据提供程序无效。找不到类“Mobile\Classes\Messages\UpToDateMessage”

MobileMessage是一个接口,导入是正确的。

php tdd phpunit testng-dataprovider

5
推荐指数
1
解决办法
2029
查看次数

在TestNG中参数化@BeforeMethod方法

我的测试有一个基础测试类,该类在每次测试之前都会进行初始化工作。

这是代码

public class BaseTestParameters {

  MyObj myObj;

  @DataProvider(name = "apiType")   
  public static Object[][] createData() {

     return new Object[][] {{"type", "1"},{"type","2"}};   
  } 

  @BeforeMethod()   
  @Factory(dataProvider = "apiType")   
  public void setup(String type,String param) throws Exception {

     myObj = createMyObject(param);

  }
}
Run Code Online (Sandbox Code Playgroud)

我所有的测试类都扩展了该基类,并使用myObj进行测试。

myObj有两种不同的创建方式(取决于参数)。所有测试将运行两次。每种构成的一种myObj

如何启用此方案?使用@Factory注释意味着我需要Object[]从该方法中返回,但是我不必从该方法中返回任何测试类。

java testng parameterized-tests testng-dataprovider

4
推荐指数
1
解决办法
183
查看次数

如何使用 TestNG DataProvider 传递 &gt; 10 个参数?

我需要将 10 多个参数传递给 TestNG Dataprovider,代码看起来像这样......

@Test (dataProvider = "Dataprovider1")
public void testScenario1(String data1, String data2,
                          String data3, String data4,
                          String data5 //...
            ) throws Exception {
    System.out.println(data1+"---------------- "+data2+" ---------------   "+data3+" .. so on");
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我,如果我们需要使用 传递超过 10 个参数,我们应该遵循什么方法@DataProvider?还有其他方法来声明测试方法的参数吗?

java testng testng-dataprovider

4
推荐指数
1
解决办法
1万
查看次数

TestNG 非静态数据提供程序方法不起作用

我有一个测试类和测试方法。这取决于数据提供者方法。数据提供程序方法位于测试类或其基类之一以外的不同类中。根据 TestNG 文档

如果你想把你的数据提供者放在一个不同的类中,它需要是一个静态方法或一个具有非参数构造函数的类,并且你在 dataProviderClass 属性中指定可以找到它的类

测试类:

package test;

import org.testng.Assert;
import org.testng.annotations.Test;

import dataprovider.TestDataProvider;

public class TestClass {
      @Test(dataProvider = "get", dataProviderClass=TestDataProvider.class)
      public void test1(String s1, String s2) {
          Assert.assertEquals(s1.length(), s2.length());
      }
}
Run Code Online (Sandbox Code Playgroud)

数据提供者类:

package dataprovider;

import org.testng.annotations.DataProvider;

public class TestDataProvider {
    @DataProvider(name = "get")
    public Object[][] testData() {
        return new Object[][] {{"a", "b"},{"c", "d"}};
    }
}
Run Code Online (Sandbox Code Playgroud)

Eclipse 的测试输出:

    java.lang.RuntimeException: Can't invoke method public java.lang.Object[][] dataprovider.
TestDataProvider.testData() on this instance of class test.TestClass due to class mismatch
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:75) …
Run Code Online (Sandbox Code Playgroud)

java testng testng-dataprovider testng-eclipse

3
推荐指数
1
解决办法
1万
查看次数

如何在不同的类中使用@DataProvider

如何使用@DataProvider它存在于不同的类?

我创建了一个不同的包,并在每个测试用例旁边定义了数据提供程序.请分享我如何在不同的课程中使用它.

testing testng automated-tests dataprovider testng-dataprovider

2
推荐指数
1
解决办法
7612
查看次数

使用不同的参数在TestNG中重复整个测试类

我有这个用selenium webdriver测试网站的代码.有四种@Test方法,一种@DataProvider有三种值.因此,总共有12个测试可以运行.

public class SomeTest {

    WebDriver driver;

    @DataProvider(name = "URLs")
    public Object[][] createData1() {
     return new Object[][] {
       {"url 1"},
       {"url 2"},
       {"url 3"}};
    }

    @BeforeMethod
    //right now I'm just setting up weddriver for chrome, but 
    //I'll need to run this test for firefox, chrome, and IE
    public void setUpWebDriver(){
        driver = WebDrivers.getChromeDriver();
    }

    @AfterMethod
    public void closeWebDriver(){
        driver.quit();
    }   

    //test methods below

    @Test(dataProvider = "URLs")
    public void test1(String url){
        //test 1 with url
    } …
Run Code Online (Sandbox Code Playgroud)

java testng selenium webdriver testng-dataprovider

2
推荐指数
2
解决办法
4958
查看次数

TestNg注释语法

我开始学习TestNG但是我遇到了困难所以我需要一些与语法相关的帮助我已经使用了注释dataProvider

@Test(dataProvider="getdata")
public void testCase02(String text1,String text2){
    System.out.println("I m in second testcase");
    System.out.println(text1);`
    System.out.println(text2);
}
Run Code Online (Sandbox Code Playgroud)

但我也想使用注释,(groups="group")所以任何人都可以帮助我解决语法同时使用两个注释.

java testng annotations testng-dataprovider

2
推荐指数
1
解决办法
84
查看次数

在testng中使用不同的dataprovider运行相同的测试

例如:

  • 数据提供者1:dataA
  • 数据提供者2:dataB,dataC
  • 数据提供者3:dataD,dataE,dataG

所以我的测试需要一个数据提供者.但我希望它根据测试组为不同的测试类型选择不同的数据提供者.例如,如果我正在运行组"冒烟",那么我想使用数据提供者1,如果我正在运行组"健全",那么我想运行数据提供者1和数据提供者2,如果我正在运行组"回归"那么我希望它运行数据提供程序1,2和3.

这可能吗?如果是这样,请您提供信息或指出我可以提供帮助的文档或其他内容.

目前我的工作是为每个组进行3次不同的测试,然后我可以选择使用哪个数据提供者.我也可以组合数据提供者.

我的工作问题是所有3个测试完全相同,不同的是组和数据提供者.

谢谢!

java testing testng automation testng-dataprovider

1
推荐指数
1
解决办法
1020
查看次数

使用提供程序时覆盖 TestNG 测试名称并省略参数

有以下示例代码......在运行测试(和报告)时,我希望将测试名称设置为提供者提供的描述字段(实际上它是任何字符串)。

...但是,即使从 ITest 扩展,似乎所有提供程序参数都附加到 TestName,我想要的只是描述。

所以实际的测试名称应该是 "TestName1" 而不是 "TestName2[1](TestName2, 2, 2, 4)" .. 这是 XML 报告中显示的内容,以及 test.aftertest 名称。

import org.testng.Assert;
import org.testng.ITest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.lang.reflect.Method;

public class TestNgProviderExample implements ITest{

    @Test(dataProvider = "summationProvider")
    public void testProvider(String description, int number1, int number2, int sum) {
        Assert.assertEquals(sum, number1 + number2);
    }

    @DataProvider(name = "summationProvider")
    public Object[][] summationData() {
        Object[][] testData = {{"TestName1",1,2,3},{"TestName2",2,2,4}};
        return testData;
    }

    private String reportedTestName = "";

    @BeforeMethod(alwaysRun = true)
    public void testData(Method method, …
Run Code Online (Sandbox Code Playgroud)

java testng testng-dataprovider

1
推荐指数
1
解决办法
3717
查看次数