19
19
20
20
class RunTestCommand extends BaseGenerateCommand
21
21
{
22
+ /**
23
+ * The return code. Determined by all tests that run.
24
+ *
25
+ * @var integer
26
+ */
27
+ private $ returnCode = 0 ;
28
+
22
29
/**
23
30
* Configures the current command.
24
31
*
@@ -44,8 +51,6 @@ protected function configure()
44
51
* @param OutputInterface $output
45
52
* @return integer
46
53
* @throws \Exception
47
- *
48
- * @SuppressWarnings(PHPMD.UnusedLocalVariable)
49
54
*/
50
55
protected function execute (InputInterface $ input , OutputInterface $ output ): int
51
56
{
@@ -76,60 +81,84 @@ protected function execute(InputInterface $input, OutputInterface $output): int
76
81
];
77
82
$ command ->run (new ArrayInput ($ args ), $ output );
78
83
}
79
- // tests with resolved suite references
80
- $ resolvedTests = $ this ->resolveSuiteReferences ($ testConfiguration );
81
84
85
+ $ testConfigArray = json_decode ($ testConfiguration , true );
86
+
87
+ if (isset ($ testConfigArray ['tests ' ])) {
88
+ $ this ->runTests ($ testConfigArray ['tests ' ], $ output );
89
+ }
90
+
91
+ if (isset ($ testConfigArray ['suites ' ])) {
92
+ $ this ->runTestsInSuite ($ testConfigArray ['suites ' ], $ output );
93
+ }
94
+
95
+ return $ this ->returnCode ;
96
+ }
97
+
98
+ /**
99
+ * Run tests not referenced in suites
100
+ *
101
+ * @param array $tests
102
+ * @param OutputInterface $output
103
+ * @return void
104
+ * @throws TestFrameworkException
105
+ */
106
+ private function runTests (array $ tests , OutputInterface $ output )
107
+ {
82
108
$ codeceptionCommand = realpath (PROJECT_ROOT . '/vendor/bin/codecept ' ) . ' run functional ' ;
83
- $ testsDirectory = TESTS_MODULE_PATH . DIRECTORY_SEPARATOR . TestGenerator::GENERATED_DIR . DIRECTORY_SEPARATOR ;
84
- $ returnCode = 0 ;
85
- //execute only tests specified as arguments in run command
86
- foreach ($ resolvedTests as $ test ) {
87
- //set directory as suite name for tests in suite, if not set to "default"
88
- if (strpos ($ test , ': ' )) {
89
- list ($ testGroup , $ testName ) = explode (": " , $ test );
90
- } else {
91
- list ($ testGroup , $ testName ) = [TestGenerator::DEFAULT_DIR , $ test ];
92
- }
93
- $ testGroup = $ testGroup . DIRECTORY_SEPARATOR ;
94
- $ testName = $ testName . 'Cest.php ' ;
95
- if (!realpath ($ testsDirectory . $ testGroup . $ testName )) {
109
+ $ testsDirectory = TESTS_MODULE_PATH .
110
+ DIRECTORY_SEPARATOR .
111
+ TestGenerator::GENERATED_DIR .
112
+ DIRECTORY_SEPARATOR .
113
+ TestGenerator::DEFAULT_DIR .
114
+ DIRECTORY_SEPARATOR ;
115
+
116
+ foreach ($ tests as $ test ) {
117
+ $ testName = $ test . 'Cest.php ' ;
118
+ if (!realpath ($ testsDirectory . $ testName )) {
96
119
throw new TestFrameworkException (
97
- $ testName . " is not available under " . $ testsDirectory . $ testGroup
120
+ $ testName . " is not available under " . $ testsDirectory
98
121
);
99
122
}
100
- $ fullCommand = $ codeceptionCommand . $ testsDirectory . $ testGroup . $ testName . ' --verbose --steps ' ;
101
- $ process = new Process ($ fullCommand );
102
- $ process ->setWorkingDirectory (TESTS_BP );
103
- $ process ->setIdleTimeout (600 );
104
- $ process ->setTimeout (0 );
105
-
106
- $ returnCode = max ($ returnCode , $ process ->run (
107
- function ($ type , $ buffer ) use ($ output ) {
108
- $ output ->write ($ buffer );
109
- }
110
- ));
123
+ $ fullCommand = $ codeceptionCommand . $ testsDirectory . $ testName . ' --verbose --steps ' ;
124
+ $ this ->returnCode = max ($ this ->returnCode , $ this ->executeTestCommand ($ fullCommand , $ output ));
111
125
}
112
- return $ returnCode ;
113
126
}
114
127
115
128
/**
116
- * Get an array of tests with resolved suite references from $testConfiguration
117
- * eg: if test is referenced in a suite, it'll be stored in format suite:test
118
- * @param string $testConfigurationJson
119
- * @return array
129
+ * Run tests referenced in suites within suites' context.
130
+ *
131
+ * @param array $suitesConfig
132
+ * @param OutputInterface $output
133
+ * @return void
120
134
*/
121
- private function resolveSuiteReferences ( $ testConfigurationJson )
135
+ private function runTestsInSuite ( array $ suitesConfig , OutputInterface $ output )
122
136
{
123
- $ testConfiguration = json_decode ($ testConfigurationJson , true );
124
- $ testsArray = $ testConfiguration ['tests ' ] ?? [];
125
- $ suitesArray = $ testConfiguration ['suites ' ] ?? [];
126
- $ testArrayBuilder = [];
127
-
128
- foreach ($ suitesArray as $ suite => $ tests ) {
129
- foreach ($ tests as $ test ) {
130
- $ testArrayBuilder [] = "$ suite: $ test " ;
131
- }
137
+ $ codeceptionCommand = realpath (PROJECT_ROOT . '/vendor/bin/codecept ' ) . ' run functional --verbose --steps ' ;
138
+ //for tests in suites, run them as a group to run before and after block
139
+ foreach (array_keys ($ suitesConfig ) as $ suite ) {
140
+ $ fullCommand = $ codeceptionCommand . " -g {$ suite }" ;
141
+ $ this ->returnCode = max ($ this ->returnCode , $ this ->executeTestCommand ($ fullCommand , $ output ));
132
142
}
133
- return array_merge ($ testArrayBuilder , $ testsArray );
143
+ }
144
+
145
+ /**
146
+ * Runs the codeception test command and returns exit code
147
+ *
148
+ * @param string $command
149
+ * @param OutputInterface $output
150
+ * @return integer
151
+ *
152
+ * @SuppressWarnings(PHPMD.UnusedLocalVariable)
153
+ */
154
+ private function executeTestCommand (string $ command , OutputInterface $ output )
155
+ {
156
+ $ process = new Process ($ command );
157
+ $ process ->setWorkingDirectory (TESTS_BP );
158
+ $ process ->setIdleTimeout (600 );
159
+ $ process ->setTimeout (0 );
160
+ return $ process ->run (function ($ type , $ buffer ) use ($ output ) {
161
+ $ output ->write ($ buffer );
162
+ });
134
163
}
135
164
}
0 commit comments