MPS, just like any self-respecting IDE, lets you run test cases. The built-in test runner can run plain Java tests, MPS-based node tests, and other kinds of test cases. The framework is user-extensible so you can have MPS treat your concepts as runnable test cases as well.
MPS sees tests as a collection of test cases (represented by the ITestCase
interface concept) that contain test
methods (instances of ITestMethod
). Note that the terminology is slightly different from some test frameworks which
speak of test suites containing test cases and there is potential for confusion, in particular regarding the term
test case. I will use the terms in their MPS meaning in the rest of this article.
The framework supports tests that are generated into Java classes using JUnit framework (JUnit 4). Tests that are generated into a different language or use a different testing framework are not supported.
Integrating your tests into the MPS framework requires you to implement ITestCase
in your test cases and ITestMethod
in your test methods. A single concept can play the roles of a test case and a test method simultaneously (this is the
case for editor tests, as represented by the EditorTestCase
concept).
Implementing ITestCase
Test cases must implement the abstract method getTestSet()
and override the non-abstract method getTestMethods()
.
Both methods have to return the list of test methods that this test case contains and you can implement one of the
methods and call it from the other one.
Two other important methods in ITestCase
are getClassName()
and getSimpleClassName()
. They return the fully
qualified class name and the simple class name of the generated test class, respectively. You can either use
getSimpleClassName()
in the generator or override the methods to return the class names that you actually generate.
By default MPS will load and run the tests in the MPS process. If you want MPS to fork a separate JVM instead, you have
to either set the canNotRunInProcess
property to true
or override ITestCase#canRunInProcess()
.
Implementing ITestMethod
Test methods need to implement the abstract methods getTestName()
and getTestCase()
which are fairly straightforward
with no hidden obstacles. getTestName()
must return the name of the generated test method and getTestCase()
should
return the “owning” test case node, often the parent of the test method, cast to the appropriate concept.
A sample
I have uploaded a sample project to GitHub, sample-custom-tests, showing how to implement custom test cases and test methods for a very simple testing language. Here is what it looks like when you run these tests in MPS: