【发布时间】:2011-10-28 01:32:13
【问题描述】:
我有这个方法签名:List<ITMData> Parse(string[] lines)
ITMData 有 35 个属性。
您将如何有效地测试这样的解析器?
问题:
- 我应该加载整个文件(我可以使用 System.IO)吗?
- 我应该将文件中的一行放入字符串常量中吗?
- 我应该测试一行还是多行
- 我应该测试 ITMData 的每个属性还是应该测试整个对象?
- 我的测试命名如何?
编辑
我将方法签名更改为ITMData Parse(string line)。
测试代码:
[Subject(typeof(ITMFileParser))]
public class When_parsing_from_index_59_to_79
{
private const string Line = ".........";
private static ITMFileParser _parser;
private static ITMData _data;
private Establish context = () => { _parser = new ITMFileParser(); };
private Because of = () => { _data = _parser.Parse(Line); };
private It should_get_fldName = () => _data.FldName.ShouldBeEqualIgnoringCase("HUMMELDUMM");
}
编辑 2
我仍然不确定是否应该只测试每个类一个属性。在我看来,这允许我为规范提供更多信息,即当我解析从索引 59 到索引 79 的单行时,我得到 fldName。如果我在一个类中测试所有属性,我会丢失这些信息。我是否过度指定了我的测试?
我的测试现在看起来像这样:
[Subject(typeof(ITMFileParser))]
public class When_parsing_single_line_from_ITM_file
{
const string Line = ""
static ITMFileParser _parser;
static ITMData _data;
Establish context = () => { _parser = new ITMFileParser(); };
private Because of = () => { _data = _parser.Parse(Line); };
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
...
}
【问题讨论】:
-
你所说的“有效”到底是什么意思?您想尽量减少单元测试的开发时间吗?
-
好吧,即用一个字符串或多个字符串进行测试?使用仅包含我想要断言的值的字符串进行测试或获取整个字符串。
-
我仍然不能 100% 确定问题到底是什么,但我会创建一组不同的单元测试。一种测试方法可能会传入一个特定的单个字符串,并断言它已被正确解析为生成的 IMTData 对象的相关属性。也许是另一个测试给定 20 行的测试,它会生成一个包含 20 个项目的列表。对于特定的困难情况,我可能有其他方法。这几乎就是@Kenny 所描述的基本单元测试内容。获取此 Parse 方法的要求,并将其逆向工程为几个证明正确性的测试用例。
-
我不知道你想如何测试它,但是方法签名是一个错误。接受一个字符串数组进行解析是没有意义的;这鼓励人们将整个文件读入内存并将其放入数组中,这几乎可以肯定是一件愚蠢的事情。接受
TextReader或IEnumerable<string>可能更合适。 (返回一个列表也很可疑,如果你能侥幸地逐行进行解析的话。) -
将整个文件读入内存并不傻。这取决于文件大小。我必须处理大约 20 MB 大的文件。 Ofc 大文件不应加载到内存中。
标签: c# unit-testing parsing flat-file mspec