allure-framework / allure-framework/allure-phpunit

If a test has dataProvider, the report doesn't have the name of the test.

Open
#88 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
PHP
Stars
66
Forks
34
PR merge metrics
No merged PRs in 30d

Description

Hi. All my tests, that have annotation `@dataProvider` don't have name, description and so on.

To reproduce, I wrote a couple of simple tests:
```
assertSame(33, $this->sum(30, 3));
}

/**
* @return void
*/
public function testSumWithReturnAnnotation(): void
{
$this->assertSame(33, $this->sum(30, 3));
}

public function testSumWIthParam(int $a = 30): void
{
$this->assertSame(33, $this->sum($a, 3));
}

/**
* @param int $a
* @return void
*/
public function testSumWithReturnAndParamAnnotation(int $a = 30): void
{
$this->assertSame(33, $this->sum($a, 3));
}

/**
* @return void
* @depends testSumSimple
*/
public function testSumWithDepends(): void
{
$this->assertSame(33, $this->sum(30, 3));
}

/**
* Hello world
*
* @param int $a
* @return void
*/
public function testSumWithSimpleComment(int $a = 30): void
{
$this->assertSame(33, $this->sum($a, 3));
}

/** !!! The test with the problem
* @dataProvider providerSumWithDataProvider
* @param int $a
* @return void
*/
public function testSumWithDataProvider(int $a = 30): void
{
$this->assertSame(33, $this->sum($a, 3));
}

public function providerSumWithDataProvider(): array
{
return [
[30],
];
}

/** !!! The test with the problem
* @dataProvider providerSumWithDataProviderGenerator
* @param int $a
* @return void
*/
public function testSumWithDataProviderGenerator(int $a = 30): void
{
$this->assertSame(33, $this->sum($a, 3));
}

public function providerSumWithDataProviderGenerator(): \Generator
{
yield [30];
}

/**
* @dataProvider providerSumWithDataProviderGeneratorAndNAmes
* @param int $a
* @return void
*/
public function testSumWithDataProviderGeneratorAndNAmes(int $a = 30): void
{
$this->assertSame(33, $this->sum($a, 3));
}

public function providerSumWithDataProviderGeneratorAndNAmes(): \Generator
{
yield 'name of the set' => [30];
}

private function sum(int $a, int $b): int
{
return $a + $b;
}
}
```

After running the test and generating report I have the following result
![image](https://user-images.githubusercontent.com/20479246/211302107-709d16d4-34d1-49ae-b617-c485ecc322c3.png)

The tests testSumWithDataProvider and testSumWithDataProviderGenerator have names "Unknown tests"

The test testSumWithDataProviderGeneratorAndNames isn't processed while generating the report by CLI command, but I suppose it is another problem. I put aside this problem for a while.

I've debugged a bit, and can find the place where the TestInfo object got the wrong value for its field "method" - \Qameta\Allure\PHPUnit\Internal\TestLifecycle::buildTestInfo.
```
private function buildTestInfo(string $test, ?string $host = null, ?string $thread = null): TestInfo
{
$dataLabelMatchResult = preg_match(
'#^([^\s]+)\s+with\s+data\s+set\s+"(.*)"\s+\(.+\)$#',
$test,
$matches,
);
// ... other content of the method
}
```
There are quotes in the regexp, but the string $test has no quotes and looks like "App\Tests\Unit\CalculatorTest::testSumWithDataProviderGenerator with data set #0 (30)"

Because of that, the field TestInfo.method contains the string "testSumWithDataProviderGenerator with data set #0 (30)".

Later in the code, when it tries to parse annotations of this method, there is exception thrown in \Qameta\Allure\PHPUnit\Internal\TestUpdater::setInfo and caught in \Qameta\Allure\AllureLifecycle::updateTest, because the name of method is incorrect.

In the result, TestInfo has empty fields.

I use the `allure-framework/allure-phpunit:2.0.0`, `allure-framework/allure-php-commons:2.0.0` and `phpunit:9.5.0`
By the way, CLI command `allure --version` returns `2.13.8`.

Can you advise what to do in such a situation?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.