2

我一直在研究 ECMAScript 实现,目前正在完善该项目。作为其中的一部分,我一直在编写如下测试:

[TestMethod]
public void ArrayReduceTest()
{
    var engine = new Engine();
    var request = new ExecScriptRequest(@"
        var a = [1, 2, 3, 4, 5];
        a.reduce(function(p, c, i, o) {
            return p + c;
        });
    ");
    var response = (ExecScriptResponse)engine.PostWithReply(request);
    Assert.AreEqual((double)response.Data, 15D);
} 

问题是这个测试和类似的测试有太多的失败点,几乎不值得。似乎我的努力会更好地用于减少模块之间的耦合。要编写一个真正的单元测试,我必须假设如下:

[TestMethod]
public void CommentTest()
{
    const string toParse = "/*First Line\r\nSecond Line*/";
    var analyzer = new LexicalAnalyzer(toParse);
    {
        Assert.IsInstanceOfType(analyzer.Next(), typeof(MultiLineComment));
        Assert.AreEqual(analyzer.Current.Value, "First Line\r\nSecond Line");
    }
}

这样做需要我编写数千个测试,这似乎又不值得。

4

1 回答 1

3

只是在这里吐口水,但是如果您将测试存储在文件/数据库/等中怎么办...(正如 Doug 指出的那样-存储在版本控制中的能力使文件成为最佳选择!)每个条目都可以有一个名称,一个脚本,以及预期输出。

然后,您可以编写一个小应用程序,使用您的引擎执行每个脚本,并将输出与预期输出进行比较,并根据结果通知您成功/失败。

这不会使您免于测试脚本引擎本身的痛点,但维护这样的东西可能比为您可以使用脚本运行时设想的每种方式编写单元测试更容易。

于 2010-06-03T15:04:02.657 回答