Yes. By default TcUnit runs all the test suites and tests in parallel, in other words all test suites and tests are run at the same time. Sometimes it is however desirable to run either the test suites or tests (or both) in a sequence, for example if you get exceed overruns while running tests. Since TcUnit 1.2 (not yet released) it’s possible to run test suites in sequence (one after another) and/or individual tests in order (one after another).
To execute test suites in a sequence, simply replace TcUnit.RUN()
with TcUnit.RUN_IN_SEQUENCE()
in your main body of the test program. This will execute the test suites in the order that they were declared. So for example if we have defined the following test suites and test program:
PROGRAM PRG_TEST VAR fbDiagnosticMessageDiagnosticCodeParser_Test : FB_DiagnosticMessageDiagnosticCodeParser_Test; fbDiagnosticMessageFlagsParser_Test : FB_DiagnosticMessageFlagsParser_Test; fbDiagnosticMessageParser_Test : FB_DiagnosticMessageParser_Test; END_VAR TcUnit.RUN_IN_SEQUENCE();
This will first execute all tests defined in fbDiagnosticMessageDiagnosticCodeParser_Test
, once all tests are finished in that function block, TcUnit will execute all tests in fbDiagnosticMessageFlagsParser_Test
, and when that is done it will execute all tests in fbDiagnosticMessageParser_Test
.
It’s also possible to execute individual tests in order by simply replacing TEST('TestName')
with TEST_ORDERED('TestName')
. This will execute the tests in the order that the TEST_ORDERED()
is called for the various tests. TEST_ORDERED()
returns a boolean to indicate whether the TcUnit framework will run the test, so in order to only execute the code when it’s time for that particular test, it makes sense to check if TEST_ORDERED()
returns true, and only then do the execution of the function blocks and assertions, for example like this:
METHOD PRIVATE TestWithTimestampZeroTimeExpectCurrentTime VAR ... (variable declaration used for the test) END_VAR IF TEST_ORDERED('TestWithTimestampZeroTimeExpectCurrentTime') THEN fbFunctionBlockUnderTest(Parameters); AssertEquals(Expected := 'SomeValue', Actual := fbFunctionBlockUnderTest.OutVariable, Message := 'Test failed'); TEST_FINISHED(); END_IF
As usual, the TEST_FINISHED()
will indicate that this test is finished, and the framework will go to the next test. Note that you don’t need to create any state machine for calling the different TEST_ORDERED()
tests. You can (and must!) call all TEST_ORDERED()
at the same time. The framework will make sure to only care about the assertions of the test that is currently running.
Note that all the following combinations are allowed in TcUnit:
TcUnit.RUN()
with all tests asTEST()
– means all tests suites and tests will run in parallel, this is the default behaviour of TcUnitTcUnit.RUN_IN_SEQUENCE()
with all tests asTEST()
– means all test suites will run in sequence, but the tests in every test suite will run in parallelTcUnit.RUN()
with all tests asTEST_ORDERED()
– means all test suites will run in parallel, but the tests in every test suite will run in sequenceTcUnit.RUN_IN_SEQUENCE()
with all tests asTEST_ORDERED()
– means all test suites will run in sequence, as will every test
For maximum flexibility, these combinations are allowed as well for special occasions:
TcUnit.RUN()
with mixed tests ofTEST()
andTEST_ORDERED()
– means all tests suites will run in parallel, with tests marked asTEST()
run in parallel with tests that are marked withTEST_ORDERED()
that run in sequence (relative to each other)TcUnit.RUN_IN_SEQUENCE()
with mixed tests ofTEST()
andTEST_ORDERED()
– means all test suites will run in sequence, with tests marked asTEST()
run in parallel with tests that are marked withTEST_ORDERED()
that run in sequence (relative to each other)
If you run tests with both TEST()
and TEST_ORDERED()
, all tests defined with TEST()
will run in parallel with the tests that are TEST_ORDERED()
.
Note that you can’t execute test-suites with both TcUnit.RUN()
and TcUnit.RUN_IN_SEQUENCE()
at the same time (which wouldn’t make any sense).
For a couple of TwinCAT projects that shows how to run both test suites in a sequence and individual tests in order, click here.
Required TcUnit version: 1.2 or later (not yet released)