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 sould 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 ?