我正在进行单元测试的第一步,并且不确定两个在单元测试中似乎自相矛盾的范例,即:
每个单元测试都应该是独立的,而不是依赖于其他测试.
不要重复自己.
更具体一点,我有一个我想测试的进口商.导入器具有"导入"功能,可以获取原始数据(例如,从CSV中删除)并返回某种类型的对象,该对象也将通过ORM(在本例中为LinqToSQL)存储到数据库中.
现在我想测试几件事情,例如返回的返回对象不为null,它的必填字段不为null或为空,并且它的属性得到了正确的值.我为此写了3个单元测试.每个测试应该导入并获得作业还是属于一般的设置逻辑?另一方面,相信这篇博文,就我的理解而言,后者将是一个坏主意.此外,这不会违反自我遏制吗?
我的班级看起来像这样:
[TestFixture] public class ImportJob { private TransactionScope scope; private CsvImporter csvImporter; private readonly string[] row = { "" }; public ImportJob() { CsvReader reader = new CsvReader(new StreamReader( @"C:\SomePath\unit_test.csv", Encoding.Default), false, ';'); reader.MissingFieldAction = MissingFieldAction.ReplaceByEmpty; int fieldCount = reader.FieldCount; row = new string[fieldCount]; reader.ReadNextRecord(); reader.CopyCurrentRecordTo(row); } [SetUp] public void SetUp() { scope = new TransactionScope(); csvImporter = new CsvImporter(); } [TearDown] public void TearDown() { scope.Dispose(); } [Test] public void ImportJob_IsNotNull() { Job j = csvImporter.ImportJob(row); Assert.IsNotNull(j); } [Test] public void ImportJob_MandatoryFields_AreNotNull() { Job j = csvImporter.ImportJob(row); Assert.IsNotNull(j.Customer); Assert.IsNotNull(j.DateCreated); Assert.IsNotNull(j.OrderNo); } [Test] public void ImportJob_MandatoryFields_AreValid() { Job j = csvImporter.ImportJob(row); Customer c = csvImporter.GetCustomer("01-01234567"); Assert.AreEqual(j.Customer, c); Assert.That(j.DateCreated.Date == DateTime.Now.Date); Assert.That(j.OrderNo == row[(int)Csv.RechNmrPruef]); } // etc. ... }
可以看出,我Job j = csvImporter.ImportJob(row);
在每个单元测试中都做了这一行,因为它们应该是自包含的.但这确实违反了DRY原则,并可能在某一天导致性能问题.
在这种情况下,最佳做法是什么?
您的测试类与通常的类没有什么不同,应该这样对待:所有良好实践(DRY,代码重用等)也应该适用于那里.