【问题标题】:Approach to unit-testing large batches of dynamically generated strings对大批量动态生成的字符串进行单元测试的方法
【发布时间】:2011-06-06 11:41:43
【问题描述】:

我的网络应用有一个类用于分析和操作存储在 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,然后循环遍历这些,为每个 url 添加一个测试。

当我运行 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

我怎么能确定我没有留下任何空白?是否有针对此类问题的通用方法,或者它是否针对特定应用程序非常具体?

【问题讨论】:

    标签: javascript unit-testing batch-processing


    【解决方案1】:

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

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

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

    【讨论】:

    • 这看起来很有希望,尽管仍然需要做很多工作来将值与 url 字符串一起存储,并考虑 url 结构(不仅仅是值)不正确的情况跨度>
    • 通常您不会存储值而是生成它们。无效的 URL 是缺少参数,对吧?
    • 不一定。事实上,通常缺少一个参数是可以的。无效 URL 的一个示例可能是 /location//hornsea 或 /blocation/hornsea,或者有冲突(指定位置和区域)或重复(指定两个不同的位置) - 它的各种方式无效,这就是为什么需要在某处存储有效/无效 url 片段示例的原因,因为从头开始计算它们的任何代码都会很复杂,并且需要与应用程序本身一样多的测试
    • 您的应用程序是测试的测试。如果测试失败,要么应用程序损坏,要么测试失败。查看像 /location//hornsea 或 /blocation/hornsea 这样的无效示例,有明显的算法来描述构造。当一个 URL 由前缀 + 一对由一个斜杠分隔的 key:value 组成时,其他所有内容都无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多