对大批动态生成的字符串进行单元测试的方法

时间:2011-06-06 11:41:44

标签: javascript unit-testing batch-processing

我的网络应用程序有一个类,用于分析和操作存储在URL哈希中的数据,类似于

http://myapp.com/#!/location/hornsea/season/spring/facilities/+shop+swimming-airport/size/50

为了能够对各种排列进行单元测试,我将一些URL片段存储在一个对象中(例如

var fragments {
    valid: ["/location/hornsea", "/season/winter","/size/50"],
    invalid: ["location/hornsea", "/seasonwinter","/size/fifty"]
}

然后在运行我的测试之前,我动态构建所有可能的有效和无效的网址,然后循环遍历这些网址,为每个网址添加测试。

当我运行测试url的有效性时,这很好,因为我只是在我的isValid()方法中检查true或false,但是在测试从URL获取参数时我不知道如何解决问题 - 我必须将返回值(例如{location:“hornsea”“})与期望值进行比较,但由于要运行测试之前动态构造要分析的字符串,因此我没有预期的值存储在任何地方。

现在,我不确定我的方法是否过度 - 我是否应该关心在所有可能的url结构上测试所有方法?我可以设置针对所有可能的URL运行的测试吗,但是当我需要更好地控制测试时,可以针对更易管理的子集运行,但仍能设法覆盖所有可能的事件。也许我可以编写一个测试套件来测试

http://myapp.com/season/autumn

足以涵盖以下示例。

http://myapp.com/location/dungeness/season/autumn
http://myapp.com/location/camberwell/seasonautumn

我怎么能确定我没有留下任何空白?是否存在针对此类问题的一般方法,或者它是否特定于特定应用程序?

1 个答案:

答案 0 :(得分:0)

您可以使用inverse function test对此进行测试。您必须编写一个函数(编码),它是您的URL解析器的反函数。 encode函数根据有效输入值构造URL。测试的形式如下:

input = {"location" : "hornsea", "season" : "winter", "size" : "50"}
assert input == parse(encode(input))

要获得良好的最佳覆盖率,您可以使用其中一个Quickcheck实现来生成输入值。使用生成的值,您可以创建有效输入参数或随机参数的子集。