Data set
Data set overview
A data set contains data used by a test case and constraints. A data set can have several variations. Each variation has constraints that are called at the end of the test flow.
Data set structure
A data set is an XML file that contains test variations for a test case.
Each variation includes:
- Data used during the test flow and assertions
- Constraints that are called after the test flow
The following table shows structure of the data set:
Node | Semantics | Attributes |
---|---|---|
config |
The root element that defines an XML namespace and an XML Schema. |
|
testCase |
Contains a reference to the test case class in attribute and variations in child elements. |
|
variation |
Contains variation description in attributes and data with constraints in child elements. |
|
data |
Data to be used by a test case. |
|
constraint |
Reference to the constraint class performed after the test flow. |
|
A variation should contain only data that is required for its flow and constraints.
A data set should be placed in the same directory with a corresponding test case.
Example data set
Let鈥檚 see an example for CreateSimpleProductEntityTest
. A data set and its corresponding test case must be placed in the <magento2>/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product
directory.
The CreateSimpleProductEntityTest.xml
data set contains:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd">
<testCase name="Magento\Catalog\Test\TestCase\Product\CreateSimpleProductEntityTest" summary="Create Simple Product" ticketId="MAGETWO-23414">
<variation name="CreateSimpleProductEntityTestVariation1" summary="Create product with custom options(fixed price)">
<data name="product/data/url_key" xsi:type="string">simple-product-%isolation%</data>
<data name="product/data/name" xsi:type="string">Simple Product %isolation%</data>
<data name="product/data/sku" xsi:type="string">simple_sku_%isolation%</data>
<data name="product/data/price/value" xsi:type="string">10000</data>
<data name="product/data/price/dataset" xsi:type="string">drop_down_with_one_option_fixed_price</data>
<data name="product/data/short_description" xsi:type="string">Simple Product short_description %isolation%</data>
<data name="product/data/description" xsi:type="string">Simple Product description %isolation%</data>
<data name="product/data/weight" xsi:type="string">50</data>
<data name="product/data/quantity_and_stock_status/qty" xsi:type="string">657</data>
<data name="product/data/custom_options/dataset" xsi:type="string">drop_down_with_one_option_fixed_price</data>
<data name="product/data/checkout_data/dataset" xsi:type="string">simple_drop_down_with_one_option_fixed_price</data>
<data name="tag" xsi:type="string">test_type:acceptance_test</data>
<constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" />
<constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" />
<constraint name="Magento\Catalog\Test\Constraint\AssertProductInCategory" />
<constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" />
<constraint name="Magento\Catalog\Test\Constraint\AssertProductInCart" />
</variation>
</testCase>
</config>
This is a data set that:
- corresponds to the XSD schema
<magento2>/dev/tests/functional/vendor/magento/mtf/etc/variations.xsd
- relates to the
Magento\Catalog\Test\TestCase\Product\CreateSimpleProductEntityTest
test case (performs creation of the simple product). - relates to the ticket
MAGETWO-23414
in Jira - contains variation
CreateSimpleProductEntityTestVariation1
that- contains data to create product with fixed price (see descriptions in the following table)
- defines tag that can be used to customize the test suite run
- defines constraints that will be performed after the test flow in the order they are presented in the data set
The CreateSimpleProductEntityTestVariation1
variation contains the following $product
data:
Fixture field | Description |
---|---|
url_key |
field is assigned with simple-product-%isolation% . More info about %isolation% . |
name | field is assigned with Simple Product %isolation% |
sku | field is assigned with simple_sku_%isolation% |
price |
|
short_description |
field is assigned with Simple Product short_description %isolation% |
description |
field is assigned with Simple Product description %isolation% |
weight |
field is assigned with 50 |
quantity_and_stock_status/qty |
field is assigned with 657 |
custom_options |
field is processed by a data source Magento\Catalog\Test\Fixture\Product\CustomOptions using a data set drop_down_with_one_option_fixed_price from the repository Magento\Catalog\Test\Repository\Product\CustomOptions |
checkout_data |
fields are assigned with a data set simple_drop_down_with_one_option_fixed_price from the Magento\Catalog\Test\Repository\CatalogProductSimple\CheckoutData repository |
How to define name
in the <data>
node
As you can see in the previous table, the name
data has a specific structure. Why? To make your test more flexible.
Data mapping by name
is performed for the test methods in test case and processAssert()
method in constraints. Let鈥檚 see the logic of the <data>
processing.
Slash /
means array nesting. For example:
<data name=var/index1>value</data>
is converted asvar[index1 => value]
<data name=var/index1/index2>value</data>
is converted asvar[index1 => [index2 => value]]
where var
is a name of an argument of a test case or a constraint.
If a variable is assigned more than one value:
<data name="price/shopping_cart/total" xsi:type="string">50</data>
<data name="price/product_page/special_price/excluding_tax" xsi:type="string">6</data>
the value is processed as an array:
$price = [
'data' => [
'shopping_cart' => [
'total' => '50'
],
'product_page' => [
'special_price' => [
'excluding_tax' => '6'
]
]
]
]
Also, in similar cases you can use array type in a data set, like:
<data name="price" xsi:type="array">
<item name="shopping_cart" xsi:type="array">
<item name="total" xsi:type="string">50</item>
<item name="product_type" xsi:type="array">
<item name="special_price" xsi:type="array">
<item name="excluding_tax" xsi:type="string">6</item>
</item>
</item>
</data>
Set a simple variable
For example, if a test case or constraint has an argument $price
, then the test case takes from the data set all the <data>
nodes with a name price
. Assume a method with the $price
argument.
<?php
public function testCreate($price)
{
//
}
?>
To assign it with 10
in one of the variations, add the following field to a variation of the corresponding data set:
<data name="price" xsi:type="string">10</data>
Set data to a fixture field
In your test you often need to use injectable fixture instances. For example:
<?php
public function testCreate(\Magento\Catalog\Test\Fixture\CatalogProductSimple $product)
{
//
}
?>
In this case, the ObjectManager sends data to the InjectableFixture constructor. It declares that your data can be passed to the fixture in $data
variable as an array. For example, to assign the existing fixture field weight
with 50
you can use the following notation:
<data name="product/data/weight" xsi:type="string">50</data>
Set data to a fixture from a repository
The InjectableFixture class enables you to use a fixture repository. It can be injected in a $dataset
variable. For example, to use dataset = product_with_special_symbols_in_name
from the repository assigned in the fixture, you can use:
<data name="product/dataset" xsi:type="string">product_with_special_symbols_in_name</data>
Set data to a fixture field from a repository
You can assign data to a fixture field from its repository.
Let鈥檚 see an example:
<data name="product/data/price/dataset" xsi:type="string">drop_down_with_one_option_fixed_price</data>
<data name="product/data/checkout_data/dataset" xsi:type="string">simple_drop_down_with_one_option_fixed_price</data>
A CatalogProductSimple.xml
fixture contains the following declarations:
<field name="price" is_required="1" group="product-details" source="Magento\Catalog\Test\Fixture\Product\Price" repository="Magento\Catalog\Test\Repository\CatalogProductSimple\Price" />
<field name="checkout_data" group="null" repository="Magento\Catalog\Test\Repository\CatalogProductSimple\CheckoutData" />
The price
fixture field contains the data source that assigns values from a repository. After the InjectableFixture class has passed data to the CatalogProductSimple fixture, Magento\Catalog\Test\Fixture\Product\Price
data source receives ['dataset' => 'drop_down_with_one_option_fixed_price']
and assigns values from the ['dataset' => 'drop_down_with_one_option_fixed_price']
of the Magento\Catalog\Test\Repository\CatalogProductSimple\Price
repository.
The checkout_data
doesn鈥檛 contain source and is assigned with values from the Magento\Catalog\Test\Repository\CatalogProductSimple\CheckoutData
directly.
Merge data sets
The MTF enables you to merge data sets from different modules. For example, if you create a new module that adds a menu option to an existing module, the MTF allows you to merge the new data with the existing data sets. As a result, you don鈥檛 have to edit the existing module to include the new information, and your tests continue to work. If you decide to later remove the same new module, you don鈥檛 need to clean the data sets in other modules.
There are two options to merge data sets in the MTF:
- add a new variation
- extend an existing variation
Add a new variation
To add a new variation using merging, you should simply use the name of a test case that you want to merge with. For example, you want to add a new variations from the Magento_ProductVideo module to the Magento\Catalog\Test\TestCase\Product\UpdateSimpleProductEntityTest
that is placed in the Magento_Catalog module. You can create data set in the Magento_ProductVideo module, containing variations you need, and paste the test case name that you want to merge with:
- Create
<magento2>/dev/tests/functional/tests/app/Magento/ProductVideo/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml
with the following code:
<?xml version="1.0" encoding="utf-8"?>
<!--
/**
* Copyright 漏 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
<testCase name="Magento\Catalog\Test\TestCase\Product\UpdateSimpleProductEntityTest" summary="Add Video to PCF" ticketId="PV-1">
<variation name="DeleteVideoFromPCFTestVariation1" summary="Delete video youtube">
<data name="initialProduct/dataset" xsi:type="string">product_with_video_youtube</data>
<data name="product/data/sku" xsi:type="string">sku_simple_product_with_video_%isolation%</data>
<data name="product/data/media_gallery/images" xsi:type="string" />
<constraint name="Magento\Catalog\Test\Constraint\AssertProductNoImageInGrid" />
<constraint name="Magento\Catalog\Test\Constraint\AssertProductForm" />
<constraint name="Magento\ProductVideo\Test\Constraint\AssertNoVideoCategoryView" />
<constraint name="Magento\ProductVideo\Test\Constraint\AssertNoVideoProductView" />
</variation>
<variation name="DeleteVideoFromPCFTestVariation2" summary="Delete video vimeo">
<data name="initialProduct/dataset" xsi:type="string">product_with_video_vimeo</data>
<data name="product/data/sku" xsi:type="string">sku_simple_product_with_video_%isolation%</data>
<data name="product/data/media_gallery/images" xsi:type="string" />
<constraint name="Magento\Catalog\Test\Constraint\AssertProductNoImageInGrid" />
<constraint name="Magento\Catalog\Test\Constraint\AssertProductForm" />
<constraint name="Magento\ProductVideo\Test\Constraint\AssertNoVideoCategoryView" />
<constraint name="Magento\ProductVideo\Test\Constraint\AssertNoVideoProductView" />
</variation>
</testCase>
</config>
Variations DeleteVideoFromPCFTestVariation1
and DeleteVideoFromPCFTestVariation2
will be used by the Magento\Catalog\Test\TestCase\Product\UpdateSimpleProductEntityTest
class during the test run.
Extend a variation with data
If you want to extend variation in another module using merging, you should use a test case name that you want to merge with and a variation name that you want to extend.
For example, see how in Magento/Catalog/Test/TestCase/Product/ValidateOrderOfProductTypeTest.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
/**
* Copyright 漏 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd">
<testCase name="Magento\Catalog\Test\TestCase\Product\ValidateOrderOfProductTypeTest" summary="Validate product types order on product grid page" ticketId="MAGETWO-37146">
<variation name="ValidateOrderOfProductTypeTestVariation1">
<data name="menu/0" xsi:type="string">Simple Product</data>
<data name="menu/3" xsi:type="string">Virtual Product</data>
<constraint name="Magento\Catalog\Test\Constraint\AssertProductTypeOrderOnCreate" />
</variation>
</testCase>
</config>
the variation ValidateOrderOfProductTypeTestVariation1
is extended by the Magento_Bundle module:
<?xml version="1.0" encoding="utf-8"?>
<!--
/**
* Copyright 漏 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd">
<testCase name="Magento\Catalog\Test\TestCase\Product\ValidateOrderOfProductTypeTest">
<variation name="ValidateOrderOfProductTypeTestVariation1">
<data name="menu/4" xsi:type="string">Bundle Product</data>
</variation>
</testCase>
</config>
Replace a variation
You can replace one variation with another by using a replace
attribute of the variation
node:
<variation name="CreateSuperNewCustomerBackendEntityTestVariation1" replace="CreateCustomerBackendEntityTestVariation1" summary="Variation that replaces default CreateCustomerBackendEntityTestVariation1">
After a merge of a data set with the variation that is mentioned, a test will use CreateSuperNewCustomerBackendEntityTestVariation1
instead of CreateSuperNewCustomerBackendEntityTestVariation1
.
Find us on