This is a beta release of documentation for Magento 2.4, published for previewing soon-to-be-released functionality. Content in this version is subject to change. Links to the v2.4 code base may not properly resolve until the code is officially released.

Database isolation annotation

To isolate database changes between tests, the Integration testing framework (ITF) implements the @magentoDbIsolation annotation. When the @magentoDbIsolation is enabled, the ITF:

  • starts a database transaction before the test/test case.
  • avoids a database commit during the test/test case.
  • restores the database after the test/test case.

Format

Database isolation annotation:

1
2
3
/**
 * @magentoDbIsolation enabled|disabled
 */

Test case declaration

Use test case declarations when a sequence of tests introduces changes to the database and relies on the changes made by each other. For example, typical CRUD tests: create -> read -> update -> delete. Every next test relies on a database state after the previous one. If at any point of that sequence (after creation) the test fails, the database will be polluted with test data. To apply a database rollback after the test case, create a separate test case with @magentoDbIsolation enabled at a class level.

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
 * @magentoDbIsolation enabled
 */
class Some\EntityTest extends \PHPUnit\Framework\TestCase
{
    public function testCreate()
    {
        $this->object->setData($this->initialData)->save();
        $this->assertNotEmpty($this->object->getId());
        return $this->object->getId();
    }

    public function testRead($objectId)
    {
        $this->object->load($objectId);
        $this->assertEquals($this->initialData, $this->object->getData());
        return $objectId;
    }

    public function testUpdate($objectId)
    {
        $this->object->setData($newData)->save();
        $object = new Some_Entity();
        $object->load($objectId);
        $this->assertEquals($newData, $object->getData());
        return $objectId;
    }

    public function testDelete($objectId)
    {
        $this->object->delete();
        $object = new Some_Entity();
        $object->load($objectId);
        $this->assertEmpty($object->getData());
    }
}

Test declaration

To isolate changes made to database by a single test, enable the @magentoDbIsolation for the test.

1
2
3
4
5
6
7
8
9
10
11
/**
* @magentoDbIsolation enabled
*/
public function testSave()
{
    $taxClassDataObject = $this->taxClassFactory->create();
    $taxClassDataObject->setClassName(self::SAMPLE_TAX_CLASS_NAME)
        ->setClassType(TaxClassManagementInterface::TYPE_CUSTOMER);
    $taxClassId = $this->taxClassRepository->save($taxClassDataObject);
    $this->assertEquals(self::SAMPLE_TAX_CLASS_NAME, $this->taxClassModel->load($taxClassId)->getClassName());
}