我正在研究的项目中有很多遗留测试,没有正确模拟出来。因此,它具有的唯一依赖性是EasyMock,它不支持静态变量,带有参数的构造函数等。测试而是依靠数据库连接,从而“运行”测试。由于需要升级现有项目以支持它,因此添加powermock来处理这些情况由于成本过高而被拒绝(另一讨论)。
我的问题是,我可以用来推销正确的单元测试的真实世界有哪些实际好处?有吗 我是在说不好的单元测试(即使它们可以工作)是不好的吗?代码覆盖范围是否同样有效?
我正在研究的项目中有很多遗留测试,没有正确模拟出来。因此,它具有的唯一依赖性是EasyMock,它不支持静态变量,带有参数的构造函数等。测试而是依靠数据库连接,从而“运行”测试。由于需要升级现有项目以支持它,因此添加powermock来处理这些情况由于成本过高而被拒绝(另一讨论)。
我的问题是,我可以用来推销正确的单元测试的真实世界有哪些实际好处?有吗 我是在说不好的单元测试(即使它们可以工作)是不好的吗?代码覆盖范围是否同样有效?
Answers:
资源资源
您需要一个测试数据库来运行测试。运行数据库的硬件比使用powermock昂贵。释放用于数据库的单元测试的资源意味着该公司不需要立即升级服务器。
可靠性
测试可能会失败,因为数据库已关闭或处于不一致状态。猜猜是什么,您的构建失败了,因为DBA在一天之内关闭了开发服务器以进行一些升级(现在,开发人员正在尝试找出代码中出了什么问题-而不是代码)。
额外维护
测试可以以任何顺序运行。添加或删除测试不应导致测试套件失败。针对数据库运行意味着在某处(数据库中)存在某种状态。通常,这些测试需要额外的维护,以确保数据库维护适当的状态,以便下次测试运行。
并发
两名开发人员同时运行单元测试。拥有数据库意味着测试可能会在数据库上发生冲突。解决方案是为运行的每个测试克隆数据库,这在实际数据库中是不允许的。这导致需要考虑另一种选择。
还考虑将HSQLDB与正在使用的数据库方言一起使用。这样,可以为每个测试创建一个内存数据库。单元测试运行,构建必要的数据库,加载数据,代码中的数据库连接连接到HSQLDB并针对测试数据运行。
我的问题是,我可以用来推销正确的单元测试的真实世界有哪些实际好处?
良好的单元测试如下(根据“清洁代码”及其他):
没有真正的单元测试会违反前三个(通常是最后一个)。这导致一些非常重要的问题:
通常,单元测试中缺乏隔离性会导致更糟糕的测试,这些测试花费更长的时间编写,花费更多的时间,并且对代码库的信任度降低。反过来,这导致人们编写更少的测试或更多地忽略测试,这是混乱的下降螺旋。
单元测试只是用来帮助开发人员交付可靠代码的工具。如果您像老板的想法那样思考,您将能够说服他,如果您提出的建议有意义。但是,如果将其作为旅行车上的布道者展示,则不会获得分配的资源。您将需要向他解释,通过花费时间和资源为您的旧应用程序改造单元测试,他将如何受益。
您提到了遗留测试-这意味着遗留代码。不幸的是,使单元测试适合未设计为要进行单元测试的代码是一个困难,耗时且昂贵的过程。如果您有提供有用结果的测试,则业务案例会变得更加困难,而您要做的就是(根据业务案例POV)提供相同结果的替代测试。您将需要关注节省的成本(时间).....
我的猜测是,由于没有人,您将无法向您的老板介绍一个稳健的业务案例。