Skip to content

[Issue] [TestFramework] Stopped marking transaction in integration tests as inactive although they're still active #39460

Open
@m2-assistant

Description

@m2-assistant

This issue is automatically created based on existing pull request: #39429: [TestFramework] Stopped marking transaction in integration tests as inactive although they're still active


Description (*)

Before an integration test is started the testing framework begins a new database transaction so that all changes to the database can be reverted after the test is completed.

The testing framework also offers a way to easily load data fixtures during this transaction with the help of the Magento\TestFramework\Fixture\DataFixture attribute. But in case of faulty fixtures an exception or error can occur. Currently this will prevent the endTest event from rolling back the transaction and so the tests fail with the error message:

Fatal error: Some transactions have not been committed or rolled back in /var/www/html/vendor/magento/framework/DB/Adapter/Pdo/Mysql.php on line 4169

instead of showing the real reason of the error.

The reason why the transaction is not rolled back correctly is that the catch block in the Transaction event marks the transaction as 'inactive' (see here) so that it won't be rolled back at the end of the test (see here), although the transaction is still open.

This PR fixes this behaviour so that the transaction is rolled back after the test execution and the correct error messages is shown in the console output.

Manual testing scenarios (*)

Add an integration test to your own test suite that uses a data fixture with an invalid config. For example:

<?php

namespace MyVendor\MyModule\Test\Integration;

use Magento\Catalog\Test\Fixture\Product as ProductFixture;
use Magento\TestFramework\Fixture\DataFixture;
use Magento\TestFramework\Fixture\DbIsolation;
use PHPUnit\Framework\TestCase;

class SynchronizerTest extends TestCase
{
    #[DbIsolation(true)]
    #[DataFixture(
        ProductFixture::class,
        ['sku' => 'test', 'name' => 'Test', 'price' => '7.77'],
        'test',
        'invalid_scope_key' // this line results in an error
    )]
    public function testSynchronize(): void
    {
        // can be empty
    }
}

Now, run the test and you should get this output:

PHPUnit 9.6.21 by Sebastian Bergmann and contributors.

FRolled back transaction has not been completed correctly.

=== Memory Usage System Stats ===
Memory usage (OS): 91.20M (188.03% of 48.50M reported by PHP)
Estimated memory leak: 42.70M (46.82% of used memory)

Fatal error: Some transactions have not been committed or rolled back in /var/www/html/vendor/magento/framework/DB/Adapter/Pdo/Mysql.php on line 4169

After applying this PR the output of phpunit shows the following:

PHPUnit 9.6.21 by Sebastian Bergmann and contributors.

F.. 3 / 3 (100%)

Time: 00:18.394, Memory: 48.00 MB

There was 1 failure:

  1. MyVendor\MyModule\Test\Integration\SynchronizerTest::testSynchronize
    PHPUnit\Framework\Exception: Unable to apply fixture: Magento\Catalog\Test\Fixture\Product (test)
    #0 /var/www/html/app/code/MyVendor/MyModule/Test/Integration/Synchronizer.php(51): MyVendor\MyModule\Test\Integration\SynchronizerTest->testSynchronize()

Caused By: ... rest of the exception with backtrace

This helps the developer to find the real issue. The previous message 'Some transactions have not been committed or rolled back' does not help.

Contribution checklist (*)

  • Pull request has a meaningful description of its purpose
  • All commits are accompanied by meaningful commit messages
  • All new or changed code is covered with unit/integration tests (if applicable)
  • README.md files for modified modules are updated and included in the pull request if any README.md predefined sections require an update
  • All automated tests passed successfully (all builds are green)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Area: Test frameworkComponent: Framework/TestFrameworkIssue: ConfirmedGate 3 Passed. Manual verification of the issue completed. Issue is confirmedPriority: P2A defect with this priority could have functionality issues which are not to expectations.Progress: PR in progressReported on 2.4.xIndicates original Magento version for the Issue report.Reproduced on 2.4.xThe issue has been reproduced on latest 2.4-develop branchTriage: Dev.ExperienceIssue related to Developer Experience and needs help with Triage to Confirm or Reject it

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions