Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SuiteGenerationTest.php
Go to the documentation of this file.
1 <?php
8 
14 use PHPUnit\Util\Filesystem;
15 use Symfony\Component\Yaml\Yaml;
18 
20 {
21  const RESOURCES_DIR = TESTS_BP . DIRECTORY_SEPARATOR . 'verification' . DIRECTORY_SEPARATOR . 'Resources';
22  const CONFIG_YML_FILE = TESTS_BP . DIRECTORY_SEPARATOR . SuiteGenerator::YAML_CODECEPTION_CONFIG_FILENAME;
23  const GENERATE_RESULT_DIR = TESTS_BP .
24  DIRECTORY_SEPARATOR .
25  "verification" .
26  DIRECTORY_SEPARATOR .
27  "_generated" .
28  DIRECTORY_SEPARATOR;
29 
35  private static $TEST_GROUPS = [];
36 
40  public static function setUpBeforeClass()
41  {
42  // destroy _generated if it exists
43  if (file_exists(self::GENERATE_RESULT_DIR)) {
44  DirSetupUtil::rmdirRecursive(self::GENERATE_RESULT_DIR);
45  }
46  }
47 
48  public function setUp()
49  {
50  // copy config yml file to test dir
51  $fileSystem = new \Symfony\Component\Filesystem\Filesystem();
52  $fileSystem->copy(
53  realpath(
54  FW_BP
55  . DIRECTORY_SEPARATOR
56  . 'etc'
57  . DIRECTORY_SEPARATOR
58  . 'config'
59  . DIRECTORY_SEPARATOR
60  . 'codeception.dist.yml'
61  ),
62  self::CONFIG_YML_FILE
63  );
64 
65  TestLoggingUtil::getInstance()->setMockLoggingUtil();
66  }
67 
71  public function testSuiteGeneration1()
72  {
73  $groupName = 'functionalSuite1';
74 
75  $expectedContents = [
76  'additionalTestCest.php',
77  'additionalIncludeTest2Cest.php',
78  'IncludeTest2Cest.php',
79  'IncludeTestCest.php'
80  ];
81 
82  // Generate the Suite
83  SuiteGenerator::getInstance()->generateSuite($groupName);
84 
85  // Validate log message and add group name for later deletion
86  TestLoggingUtil::getInstance()->validateMockLogStatement(
87  'info',
88  "suite generated",
89  ['suite' => $groupName, 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . $groupName]
90  );
91 
92  self::$TEST_GROUPS[] = $groupName;
93 
94  // Validate Yaml file updated
95  $yml = Yaml::parse(file_get_contents(self::CONFIG_YML_FILE));
96  $this->assertArrayHasKey($groupName, $yml['groups']);
97 
98  $suiteResultBaseDir = self::GENERATE_RESULT_DIR .
99  DIRECTORY_SEPARATOR .
100  $groupName .
101  DIRECTORY_SEPARATOR;
102 
103  // Validate tests have been generated
104  $dirContents = array_diff(scandir($suiteResultBaseDir), ['..', '.']);
105 
106  foreach ($expectedContents as $expectedFile) {
107  $this->assertTrue(in_array($expectedFile, $dirContents));
108  }
109  }
110 
114  public function testSuiteGenerationParallel()
115  {
116  $groupName = 'functionalSuite1';
117 
118  $expectedGroups = [
119  'functionalSuite1_0',
120  'functionalSuite1_1',
121  'functionalSuite1_2',
122  'functionalSuite1_3'
123  ];
124 
125  $expectedContents = [
126  'additionalTestCest.php',
127  'additionalIncludeTest2Cest.php',
128  'IncludeTest2Cest.php',
129  'IncludeTestCest.php'
130  ];
131 
132  //createParallelManifest
134  $parallelManifest = TestManifestFactory::makeManifest("parallel", ["functionalSuite1" => []]);
135 
136  // Generate the Suite
137  $parallelManifest->createTestGroups(1);
138  SuiteGenerator::getInstance()->generateAllSuites($parallelManifest);
139 
140  // Validate log message (for final group) and add group name for later deletion
141  $expectedGroup = $expectedGroups[count($expectedGroups)-1] ;
142  TestLoggingUtil::getInstance()->validateMockLogStatement(
143  'info',
144  "suite generated",
145  ['suite' => $expectedGroup, 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . $expectedGroup]
146  );
147 
148  self::$TEST_GROUPS[] = $groupName;
149 
150  // Validate Yaml file updated
151  $yml = Yaml::parse(file_get_contents(self::CONFIG_YML_FILE));
152  $this->assertEquals(array_intersect($expectedGroups, array_keys($yml['groups'])), $expectedGroups);
153 
154  foreach ($expectedGroups as $expectedFolder) {
155  $suiteResultBaseDir = self::GENERATE_RESULT_DIR .
156  DIRECTORY_SEPARATOR .
157  $expectedFolder .
158  DIRECTORY_SEPARATOR;
159 
160  // Validate tests have been generated
161  $dirContents = array_diff(scandir($suiteResultBaseDir), ['..', '.']);
162 
163  //Validate only one test has been added to each group since lines are set to 1
164  $this->assertEquals(1, count($dirContents));
165  $this->assertContains(array_values($dirContents)[0], $expectedContents);
166  }
167  }
168 
172  public function testSuiteGenerationHooks()
173  {
174  $groupName = 'functionalSuiteHooks';
175 
176  $expectedContents = [
177  'IncludeTestCest.php'
178  ];
179 
180  // Generate the Suite
181  SuiteGenerator::getInstance()->generateSuite($groupName);
182 
183  // Validate log message and add group name for later deletion
184  TestLoggingUtil::getInstance()->validateMockLogStatement(
185  'info',
186  "suite generated",
187  ['suite' => $groupName, 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . $groupName]
188  );
189  self::$TEST_GROUPS[] = $groupName;
190 
191  // Validate Yaml file updated
192  $yml = Yaml::parse(file_get_contents(self::CONFIG_YML_FILE));
193  $this->assertArrayHasKey($groupName, $yml['groups']);
194 
195  $suiteResultBaseDir = self::GENERATE_RESULT_DIR .
196  DIRECTORY_SEPARATOR .
197  $groupName .
198  DIRECTORY_SEPARATOR;
199 
200  // Validate tests have been generated
201  $dirContents = array_diff(scandir($suiteResultBaseDir), ['..', '.']);
202 
203  foreach ($expectedContents as $expectedFile) {
204  $this->assertTrue(in_array($expectedFile, $dirContents));
205  }
206 
207  //assert group file created and contains correct contents
208  $groupFile = PROJECT_ROOT .
209  DIRECTORY_SEPARATOR .
210  "src" .
211  DIRECTORY_SEPARATOR .
212  "Magento" .
213  DIRECTORY_SEPARATOR .
214  "FunctionalTestingFramework" .
215  DIRECTORY_SEPARATOR .
216  "Group" .
217  DIRECTORY_SEPARATOR .
218  $groupName .
219  ".php";
220 
221  $this->assertTrue(file_exists($groupFile));
222  $this->assertFileEquals(
223  self::RESOURCES_PATH . DIRECTORY_SEPARATOR . $groupName . ".txt",
224  $groupFile
225  );
226  }
227 
231  public function testSuiteGenerationSingleRun()
232  {
233  //using functionalSuite2 to avoid directory caching
234  $groupName = 'functionalSuite2';
235 
236  $expectedContents = [
237  'additionalTestCest.php',
238  'additionalIncludeTest2Cest.php',
239  'IncludeTest2Cest.php',
240  'IncludeTestCest.php'
241  ];
242 
243  //createParallelManifest
245  $singleRunManifest = TestManifestFactory::makeManifest("singleRun", ["functionalSuite2" => []]);
246 
247  // Generate the Suite
248  SuiteGenerator::getInstance()->generateAllSuites($singleRunManifest);
249  $singleRunManifest->generate();
250 
251  // Validate log message and add group name for later deletion
252  TestLoggingUtil::getInstance()->validateMockLogStatement(
253  'info',
254  "suite generated",
255  ['suite' => $groupName, 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . $groupName]
256  );
257  self::$TEST_GROUPS[] = $groupName;
258 
259  // Validate Yaml file updated
260  $yml = Yaml::parse(file_get_contents(self::CONFIG_YML_FILE));
261  $this->assertArrayHasKey($groupName, $yml['groups']);
262 
263  $suiteResultBaseDir = self::GENERATE_RESULT_DIR .
264  DIRECTORY_SEPARATOR .
265  $groupName .
266  DIRECTORY_SEPARATOR;
267 
268  // Validate tests have been generated
269  $dirContents = array_diff(scandir($suiteResultBaseDir), ['..', '.']);
270 
271  foreach ($expectedContents as $expectedFile) {
272  $this->assertTrue(in_array($expectedFile, $dirContents));
273  }
274 
275  $expectedManifest = "verification"
276  . DIRECTORY_SEPARATOR
277  . "_generated"
278  . DIRECTORY_SEPARATOR
279  . "default"
280  . DIRECTORY_SEPARATOR
281  . PHP_EOL
282  . "-g functionalSuite2"
283  . PHP_EOL;
284 
285  $this->assertEquals($expectedManifest, file_get_contents(self::getManifestFilePath()));
286  }
287 
292  public function tearDown()
293  {
294  DirSetupUtil::rmdirRecursive(self::GENERATE_RESULT_DIR);
295 
296  // delete config yml file from test dir
297  $fileSystem = new \Symfony\Component\Filesystem\Filesystem();
298  $fileSystem->remove(
299  self::CONFIG_YML_FILE
300  );
301  }
302 
306  public static function tearDownAfterClass()
307  {
308  TestLoggingUtil::getInstance()->clearMockLoggingUtil();
309  }
310 
316  private static function getManifestFilePath()
317  {
318  return TESTS_BP .
319  DIRECTORY_SEPARATOR .
320  "verification" .
321  DIRECTORY_SEPARATOR .
322  "_generated" .
323  DIRECTORY_SEPARATOR .
324  'testManifest.txt';
325  }
326 }
const PROJECT_ROOT
Definition: _bootstrap.php:8
static makeManifest($runConfig, $suiteConfiguration, $testPath=TestGenerator::DEFAULT_DIR)