我有两个不同的类共享一个公共接口。虽然功能相同但内部工作方式却截然不同。所以我很自然地想要测试它们。
我能想到的最好的例子;一世 序列化某个文件,一个 class将其序列化为纯文本 另外xml。数据(应该)看起来 之前和之后相同 序列化无论方法如何 使用
以同样的方式测试这两个类的最佳方法是什么?测试仅在实例化不同类的方式上有所不同。我不想复制整个测试,重命名并更改一行。
测试目前在JUnit中,但我还是要将它们移植到NUnit,因此代码并不重要。我正在寻找适用于此测试套件的设计模式。
答案 0 :(得分:4)
为测试创建一个通用的抽象基础测试类。
abstract class BaseTest{
@Test
public void featureX(){
Type t = createInstance();
// do something with t
}
abstract Type createInstance();
}
ConcreteTest extends BaseTest{
Type createInstace(){
return //instantiate concrete type here.
}
}
答案 1 :(得分:1)
我会使用继承或聚合重用代码。
要获得最短的代码,我会将测试的实例创建移动到XmlImplementationTest类中的工厂方法,并从中继承TextImplementationTest:
XmlImplementationTest extends TestCase
{
Interface tested = null
Interface createTested() { return new XmlImplementation() }
...
void setUp() { tested = createTested(); }
}
TextImplementationTest extends XmlImplementationTest
{
override Interface createTested() { return new TextImplementation() }
}
这不是完全正确的OO设计,因为TextImplementationTest
不是XmlImplementationTest
。但通常你不需要关心它。
或者readdress测试方法调用一些常见的实用程序类。这将涉及更多代码,而不是在测试报告中显示正确的测试类,但可能更容易调试。
答案 2 :(得分:1)
我倾向于避免测试类之间的任何关系。我喜欢尽可能保持测试用例(或类)的原子性。在这里使用继承的好处并没有超过你通过它获得的强耦合。
我想如果你可以分享两个类的结果验证(假设blackbox测试)会有所帮助。如果这两个类都能够让你设置一个输出流,那么你可以验证这一点,而类本身会写入PrintWriter或FileWriter(或者你需要的任何内容)。
此外,我会避免在单元测试期间创建文件,因为它可能需要花费太多时间(+它可能无法在构建计算机上运行),因此会延迟构建。
答案 3 :(得分:0)
在C#中,我使用通用的辅助方法来测试这两种情况,例如:
internal static void SerializationTestHelper<T>() where T : IMySerialize
{
T serialize = new T();
// do some testing
}
[TestMethod]
public void XmlTest()
{
SerializationTestHelper<XmlSerialize>();
}
[TestMethod]
public void PlainTextTest()
{
SerializationTestHelper<PlainTextSerialize>();
}