I program mostly in scala and java, using scalatest in scala and junit for unit testing. I would like to apply the very same tests to several implementations of the same interface/trait. The idea is to verify that the interface contract is enforced and to check Liskov substitution principle.
For instance, when testing implementations of lists, tests could include:
- An instance should be empty, if and only if and only if it has zero size.
- After calling clear, the size should be zero.
- Adding an element in the middle of a list, will increment by one the index of rhs elements.
- etc.
What are the best practices ?
This sounds like it could be a job for shared tests. Shared tests are tests that are shared by different fixture objects. I.e., the same test code is run on different data. ScalaTest does have support for that. Search for “shared tests” in the documentation of your favorite style trait that represents tests as functions (Spec, WordSpec, FunSuite, FlatSpec, etc.). An example is the syntax for FlatSpec:
it should behave like emptyListSee Sharing Tests in the
FlatSpecdocumentation