Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 1 commit into
base: 2.4-develop
Choose a base branch
from

Conversation

stollr
Copy link
Contributor

@stollr stollr commented Dec 3, 2024

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)

Resolved issues:

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

… still active

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 completed. The testing framework also offers a way to easily load data fixtures during this transaction with the help of the  attribute. But in case of faulty fixtures an exception or error can occure. Currently this will prevent the  event from rollback 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'.

The issue is that the catch block in the Transaction event marks the transaction as 'inactive' so that it won't be rolled back at the end of the test, although the transaction is still open. This is fixed now.
Copy link

m2-assistant bot commented Dec 3, 2024

Hi @stollr. Thank you for your contribution!
Here are some useful tips on how you can test your changes using Magento test environment.
❗ Automated tests can be triggered manually with an appropriate comment:

  • @magento run all tests - run or re-run all required tests against the PR changes
  • @magento run <test-build(s)> - run or re-run specific test build(s)
    For example: @magento run Unit Tests

<test-build(s)> is a comma-separated list of build names.

Allowed build names are:
  1. Database Compare
  2. Functional Tests CE
  3. Functional Tests EE
  4. Functional Tests B2B
  5. Integration Tests
  6. Magento Health Index
  7. Sample Data Tests CE
  8. Sample Data Tests EE
  9. Sample Data Tests B2B
  10. Static Tests
  11. Unit Tests
  12. WebAPI Tests
  13. Semantic Version Checker

You can find more information about the builds here
ℹ️ Run only required test builds during development. Run all test builds before sending your pull request for review.


For more details, review the Code Contributions documentation.
Join Magento Community Engineering Slack and ask your questions in #github channel.

@engcom-Hotel engcom-Hotel added the Triage: Dev.Experience Issue related to Developer Experience and needs help with Triage to Confirm or Reject it label Dec 10, 2024
@engcom-Hotel
Copy link
Contributor

@magento create issue

@engcom-Hotel engcom-Hotel added the Priority: P2 A defect with this priority could have functionality issues which are not to expectations. label Dec 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Priority: P2 A defect with this priority could have functionality issues which are not to expectations. Progress: pending review Triage: Dev.Experience Issue related to Developer Experience and needs help with Triage to Confirm or Reject it
Projects
None yet
2 participants