C# 对两个不同的类应用一个测试
我有两个不同的类,它们共享一个公共接口。尽管功能相同,但它们在内部的工作方式却截然不同。所以很自然我想测试他们两个 我能想出的最好的例子;我 将某物序列化为文件,一个 类将其序列化为纯文本 另一种是xml。数据(应该)看起来 在考试前后都一样 不考虑方法的序列化 用过 以相同的方式测试两个类的最佳方法是什么?这些测试只是在实例化不同类的方式上有所不同。我不想复制整个测试,重命名它并更改一行C# 对两个不同的类应用一个测试,c#,java,unit-testing,design-patterns,junit,C#,Java,Unit Testing,Design Patterns,Junit,我有两个不同的类,它们共享一个公共接口。尽管功能相同,但它们在内部的工作方式却截然不同。所以很自然我想测试他们两个 我能想出的最好的例子;我 将某物序列化为文件,一个 类将其序列化为纯文本 另一种是xml。数据(应该)看起来 在考试前后都一样 不考虑方法的序列化 用过 以相同的方式测试两个类的最佳方法是什么?这些测试只是在实例化不同类的方式上有所不同。我不想复制整个测试,重命名它并更改一行 测试目前在JUnit中,但无论如何我都会将它们移植到NUnit,这样代码就不重要了。我正在寻找一种设计模式
测试目前在JUnit中,但无论如何我都会将它们移植到NUnit,这样代码就不重要了。我正在寻找一种设计模式来应用于这个测试套件 为测试创建公共抽象基类
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.
}
}
我将通过继承或聚合重用代码 为了获得最短的代码,我将测试实例创建移动到例如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
。但通常你不需要关心它
或者将测试方法调用重新格式化为某个公共实用程序类。这将涉及更多的代码,并且不会在测试报告中显示正确的测试类,但可能更容易调试。在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>();
}
内部静态void SerializationTestHelper(),其中T:IMySerialize
{
T serialize=newt();
//做一些测试
}
[测试方法]
公共测试
{
SerializationTestHelper();
}
[测试方法]
公共无效明文测试()
{
SerializationTestHelper();
}
我倾向于避免测试类之间的任何关系。我喜欢让测试用例(或类)尽可能原子化。在这里使用继承的好处并不超过它所带来的强耦合
我想如果你能分享这两个类的结果的验证(假设黑盒测试),这会很有帮助。如果这两个类都可以让您设置outputstream,那么您可以在类本身写入PrintWriter或FileWriter(或您案例中需要的任何内容)时验证它
此外,我会避免在单元测试期间创建文件,因为这可能会花费太多时间(+它可能无法在构建机器上工作),因此会延迟构建。好选项,但您还需要将
BaseTest
标记为忽略,以便xUnit不会尝试运行它。具体取决于运行程序。有多少聪明的人。前者认为类是抽象的,而后者可以配置为根据模式忽略类。确实非常有效的点,但将它们完全分开意味着大约1000行(接近)相同的代码。当需要更新两个测试时,更改接口或其工作方式似乎有点像一罐蠕虫。但也许你是对的,也许这是你用相似的逻辑写两门课时得到的结果。你在写测试之前写了这些课,也许这给了你一个教训