我写了220行,有5种公共方法。我有一个单元测试类,在这个类上运行28个测试,占用超过1200行代码,但这主要是由于重复设置测试代码。此代码在我的项目中测试DAL,以确保它与数据库正确交互,并确保所涉及的存储过程正确运行。看起来我做了很多工作来测试很少的代码。我正在使用带有Rhino模拟的模拟,以避免在可能的情况下编写自己的存根。
这是典型的单元测试经验吗?
答案 0 :(得分:3)
以什么方式典型?
如果你的意思是你有比实际代码更多的单元测试代码,那么是的。但是你应该像对待“真正的”代码那样对待你的单元测试代码,因为你应该删除重复并重构它,直到它尽可能地精益/可取。
此外,如果您正在测试DAL以及与真实数据库的交互,那么您所拥有的是集成测试。
修改强>
我最近开始为常见的测试模式编写单元测试基类,我有很多设置代码和辅助方法。我最近的单元测试基类是一个通用的,它允许我非常容易地测试wcf-web-api类。所以,我的实际测试课程非常精简并且“非常重要”。 YMMV
答案 1 :(得分:2)
是的,这对于单元测试来说非常正常。
运行测试所需的代码大小经常被低估,特别是需要大量设置样板的代码,例如数据库访问。
虽然您可以尝试将设置代码重构为单独的方法,但这对于您所描述的情况来说非常正常。
通过28次测试,您的1200线减少到每次测试约43次。考虑到你正在重复你的设置代码,这是非常合理的。
答案 2 :(得分:2)
相当普遍单元测试类包含的LOC多于实际测试类。考虑设置依赖关系,准备伪造数据以及所有与单元测试相关的问题,这是合理的。
但是,在与数据库交互方面测试DAL并检查是否调用了正确的过程就像集成测试一样。您可能想重新考虑您想要做的事情。通过单元测试,所有数据库谈话都应该被模拟/存根。
如果您遇到1200行代码问题,可以将测试分解为 contexts ,例如。每个上下文匹配测试类的特定部分(公共方法,属性集等)。
修改强>
只是添加其他人也这样做的例子。您可以查看Aggregate
项目中AggregateTests
和Edulinq类的来源。 15个测试来测试3个公共方法,测试类是测试类的两倍。
答案 3 :(得分:1)
一个班级的28个测试听起来像是在做太多事情。
答案 4 :(得分:1)
您可能想尝试编写一些直接针对数据库运行的测试,并考虑是否更好。我发现它需要更多的工作才能完成数据库设置,但后来工作量减少了,因为我不需要伪造下层。测试运行速度较慢,但他们更完整地验证了测试。当然,此时它并不是真正的单元测试。