C# 集成测试的代码内与脚本内数据生成

C# 集成测试的代码内与脚本内数据生成,c#,tdd,integration-testing,autofixture,C#,Tdd,Integration Testing,Autofixture,这个问题很可能是基于观点的。然而,我相信有坚实论据支持的观点为做出正确的决定铺平了道路 我确实喜欢使用Autofixture生成DB状态。 我真的不喜欢编写SQL脚本,然后将期望值与脚本的假设“神奇地”联系起来,因为我不喜欢知识/逻辑跨层/跨技术传播。 我讨厌当一些没有默认值的列被添加到表中时测试如何失败,我们必须手动编辑所有失败的脚本,即使对于根本不使用该列的测试也是如此 我喜欢从DB的状态很容易得出期望值,或者看到当DB模式和类发生变化时编译是如何失败的。而问题只会出现在触碰变更列的测试中

这个问题很可能是基于观点的。然而,我相信有坚实论据支持的观点为做出正确的决定铺平了道路

我确实喜欢使用Autofixture生成DB状态。

我真的不喜欢编写SQL脚本,然后将期望值与脚本的假设“神奇地”联系起来,因为我不喜欢知识/逻辑跨层/跨技术传播。

我讨厌当一些没有默认值的列被添加到表中时测试如何失败,我们必须手动编辑所有失败的脚本,即使对于根本不使用该列的测试也是如此

我喜欢从DB的状态很容易得出期望值,或者看到当DB模式和类发生变化时编译是如何失败的。而问题只会出现在触碰变更列的测试中

我的同事们半信半疑地接受了最后的论点,但仍然坚持调试的简单性比测试的脆弱性更重要。他们认为随机生成的数据很难调试和读取,他们坚持认为理解4个静态/稳定sql屏幕比查看生成一些对象集合的代码,然后设置“受测试的逻辑影响”属性值要容易得多

他们的观点是:

当我明确表示实体A必须与实体B相关时 后来我看到A与C有关,我知道是什么导致了错误。 但很难将无意义的对象连接起来:B和C成为 人类无法区分的。并将身份赋予 实体我们必须设置不影响逻辑的其他属性 正在测试中

我提出了一些妥协。
通常有一些“Name”属性,我们可以手动设置对象的so“tag”

他们不愿意接受这项建议,这让我想问:

好了,伙计们,让我们暂时忘掉Autofixture的随机性,假装一下 我们只是将DB状态表示为POCO对象,并在之前将它们持久化 调用正在测试的方法。我们放松了构造逻辑的独立性,但我们仍然可以明确地设置从状态派生的期望



事实上,我对这种反应感到惊讶:

要调试这些,我需要打开VisualStudio并执行 数据持久化后暂停。但是,我们不提交事务 -测试完成后,将回滚所有更改。因此,我需要从SQLManagementStudio中读取未限制的数据。有那么多 仅用于调试存储过程的移动。我更喜欢写作 sql脚本而不是POCOS

所以现在它变成了一个关于个人喜好和品味的讨论。另一方面,它很容易成为一个有偏见、充满激情的采摘者,失去客观性


这就是为什么我想听听社区里的一些想法和观点。

我发现很难准确地理解你想要的观点是什么。即便如此,你还是在用问答网站开始讨论,这是离题的。你应该和你的同事再召开一次会议。我不希望以讨论的形式。我希望答案以脚本的形式出现:赞成和反对。Pocos:优点和缺点。它们应该适用于这两种方法。FWIW,AutoFixture(主要)是一种TDD工具,从来没有设计过用数据填充数据库。涉及数据库的自动化测试往往是缓慢而脆弱的,如果可能的话应该避免。通常,最好的选择是将数据访问层替换为测试双精度层,但如果必须让数据库参与测试,请注意测试金字塔,并且只在尽可能少的测试中进行。如有必要,可以自定义AutoFixture以创建更“真实”的值。这里有一个概念证明:FIWI,当我必须在自动化测试中涉及数据库时,我倾向于使用以下方法: