Magento 2.1.18 is the final 2.1.x release. After June 2019, Magento 2.1.x will no longer receive security patches, quality fixes, or documentation updates.
To maintain your site's performance, security, and PCI compliance, upgrade to the latest version of Magento.

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 declaration 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
37
/**
 * @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. An example of a test from the dev/tests/integration/testsuite/Magento/Tax/Model/TaxClass/RepositoryTest.php:

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());
}
Updated