Например, существует интерфейс IMyInterface
, и три класса поддерживают этот интерфейс:
class A : IMyInterface
{
}
class B : IMyInterface
{
}
class C : IMyInterface
{
}
Самым простым способом я мог записать три тестовых класса: ATest, опытная эксплуатация, CTest и тестируют их отдельно. Однако, так как они поддерживают тот же интерфейс, большая часть тестового кода была бы тем же, трудно поддержать. Как я могу использовать простой и легкий способ протестировать интерфейс, который поддерживается другим классом?
Чтобы протестировать интерфейс с помощью общих тестов независимо от реализации, вы можете использовать абстрактный тестовый пример, а затем создать конкретные экземпляры тестового примера для каждой реализации интерфейса.
Абстрактный (базовый) тестовый пример выполняет тесты, не зависящие от реализации (т. Е. Проверяет контракт интерфейса), в то время как конкретные тесты заботятся о создании экземпляра объекта для тестирования и выполняют любые тесты, зависящие от реализации.
Можно было создавать методы, которые принимают параметр типа IMyInterface, а фактические методы тестирования просто вызывают эти методы, передаваемые в разные конкретные классы.
Вы не тестируете интерфейс напрямую, но можете написать абстрактный класс, который проверяет контракт, который должна расширять конкретная реализация. Тогда проверка конкретного класса расширит абстрактный класс
Если вы хотите запустить одни и те же тесты для разных разработчиков вашего интерфейса, используя NUnit в качестве примера:
public interface IMyInterface {}
class A : IMyInterface { }
class B : IMyInterface { }
class C : IMyInterface { }
public abstract class BaseTest
{
protected abstract IMyInterface CreateInstance();
[Test]
public void Test1()
{
IMyInterface instance = CreateInstance();
//Do some testing on the instance...
}
//And some more tests.
}
[TestFixture]
public class ClassATests : BaseTest
{
protected override IMyInterface CreateInstance()
{
return new A();
}
[Test]
public void TestCaseJustForA()
{
IMyInterface instance = CreateInstance();
//Do some testing on the instance...
}
}
[TestFixture]
public class ClassBTests : BaseTest
{
protected override IMyInterface CreateInstance()
{
return new B();
}
}
[TestFixture]
public class ClassCTests : BaseTest
{
protected override IMyInterface CreateInstance()
{
return new C();
}
}