gpt4 book ai didi

c# - 单元测试 - 基于算法还是基于样本?

转载 作者:太空狗 更新时间:2023-10-29 19:40:01 25 4
gpt4 key购买 nike

假设我正在尝试测试一个简单的 Set 类

public IntSet : IEnumerable<int>
{
Add(int i) {...}
//IEnumerable implementation...
}

假设我正在尝试测试集合中不​​能存在重复值。我的第一个选择是将一些示例数据插入到集合中,并使用我对所用数据的了解来测试重复项,例如:

    //OPTION 1
void InsertDuplicateValues_OnlyOneInstancePerValueShouldBeInTheSet()
{
var set = new IntSet();

//3 will be added 3 times
var values = new List<int> {1, 2, 3, 3, 3, 4, 5};
foreach (int i in values)
set.Add(i);

//I know 3 is the only candidate to appear multiple times
int counter = 0;
foreach (int i in set)
if (i == 3) counter++;

Assert.AreEqual(1, counter);
}

我的第二个选择是一般测试我的情况:

    //OPTION 2
void InsertDuplicateValues_OnlyOneInstancePerValueShouldBeInTheSet()
{
var set = new IntSet();

//The following could even be a list of random numbers with a duplicate
var values = new List<int> { 1, 2, 3, 3, 3, 4, 5};
foreach (int i in values)
set.Add(i);

//I am not using my prior knowledge of the sample data
//the following line would work for any data
CollectionAssert.AreEquivalent(new HashSet<int>(values), set);
}

当然,在这个例子中,我方便地有一个集合实现来检查,以及比较集合的代码 (CollectionAssert)。但如果我两者都没有呢?这段代码肯定比前一个选项的代码更复杂!这就是您测试现实生活中的自定义业务逻辑时的情况。

诚然,对预期条件的测试通常涵盖更多情况 - 但它变得非常类似于再次实现逻辑(这既乏味又无用 - 你不能使用相同的代码来检查自己!)。基本上我在问我的测试应该看起来像“插入 1、2、3 然后检查关于 3 的东西”还是“插入 1、2、3 并检查一般的东西”

编辑 - 为了帮助我理解,如果您更喜欢选项 1 或选项 2(或者两者都不喜欢,或者这取决于具体情况等),请在您的回答中说明。澄清一下,很明显,在这种 情况下 (IntSet),选项 2 在所有方面都更好。但是,我的问题与您没有要检查的替代实现的情况有关,因此选项 2 中的代码肯定比选项 1 更复杂。

最佳答案

我通常更喜欢一个一个地测试用例——这很适合 TDD 方式:“编码一点,测试一点”。当然,一段时间后我的测试用例开始包含重复代码,所以我进行了重构。验证结果的实际方法对我来说并不重要,只要它确实有效,并且不会影响测试本身。因此,如果有一个“引用实现”来测试,那就更好了。

但是,重要的是测试应该是可重现的,并且应该清楚每种测试方法实际测试的是什么。对我来说,将随机值插入集合中两者都不是 - 当然,如果涉及大量数据/用例,欢迎使用每种工具或方法,这有助于更好地处理这种情况而不会让我 NumPy 陷入一种虚假的安全感。

关于c# - 单元测试 - 基于算法还是基于样本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4713698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com