Unit testing “强烈的”;单元测试“;在硬件便宜的时候

Unit testing “强烈的”;单元测试“;在硬件便宜的时候,unit-testing,architecture,Unit Testing,Architecture,我在想杰夫·阿特伍德的著名文章“”和马丁·福勒的推荐信 我尝试过的方法: 我已经遭受了太慢的测试,这是由于大量使用数据库造成的。我喜欢它便宜。。一开始 我已经尝试了一个具有持久性、易于测试的域对象的多层体系结构。我喜欢它易于维护和使用。但这在时间上是昂贵的 如果我有足够的时间资源,我通常会选择第二种方式,但大多数时候我不得不选择第一种方式 如何找到更具成本效益的方法?这是使用非常强大的硬件的第一种方法吗?我不喜欢单元测试影响任何外部内容,无论是数据库还是文件系统。许多人将这些集成测试称为集成测试

我在想杰夫·阿特伍德的著名文章“”和马丁·福勒的推荐信

我尝试过的方法:

  • 我已经遭受了太慢的测试,这是由于大量使用数据库造成的。我喜欢它便宜。。一开始
  • 我已经尝试了一个具有持久性、易于测试的域对象的多层体系结构。我喜欢它易于维护和使用。但这在时间上是昂贵的
  • 如果我有足够的时间资源,我通常会选择第二种方式,但大多数时候我不得不选择第一种方式


    如何找到更具成本效益的方法?这是使用非常强大的硬件的第一种方法吗?

    我不喜欢单元测试影响任何外部内容,无论是数据库还是文件系统。许多人将这些集成测试称为集成测试,而不是单元测试

    执行速度是此类测试的一个问题,但设置速度也是如此。

    您(或您团队中的任何其他人)应该能够从源代码管理中检出代码和测试,并立即运行它们。他们不应该在创建数据库方面乱来。测试越难运行,其用处就越小

    如果您的测试具有最小的依赖性,那么持续集成也会容易得多

    我认为快速硬件无法克服具有外部依赖性的缺点,因为磁盘和网络访问比内存访问慢得多。运行无依赖性单元测试的旧机器将比必须访问磁盘和数据库的新机器更快

    至于你两种选择之间的权衡,我认为这是一个规模问题。如果在一个小项目中只有一个程序员,那么我认为这种方法就足够了

    但是,您运行的测试越多,需要运行测试的人越多,不分离单元测试和集成测试的缺点就越大

    这实际上是一个固定成本与可变成本的问题。建立严格的单元测试可能需要一些时间,但是如果您的项目足够大,您可以将在提高生产力的几个月中花费的时间增加


    一如既往,这取决于项目的具体情况。祝你好运

    我不喜欢影响任何外部的单元测试,不管是数据库还是文件系统。许多人将这些集成测试称为集成测试,而不是单元测试

    执行速度是此类测试的一个问题,但设置速度也是如此。

    您(或您团队中的任何其他人)应该能够从源代码管理中检出代码和测试,并立即运行它们。他们不应该在创建数据库方面乱来。测试越难运行,其用处就越小

    如果您的测试具有最小的依赖性,那么持续集成也会容易得多

    我认为快速硬件无法克服具有外部依赖性的缺点,因为磁盘和网络访问比内存访问慢得多。运行无依赖性单元测试的旧机器将比必须访问磁盘和数据库的新机器更快

    至于你两种选择之间的权衡,我认为这是一个规模问题。如果在一个小项目中只有一个程序员,那么我认为这种方法就足够了

    但是,您运行的测试越多,需要运行测试的人越多,不分离单元测试和集成测试的缺点就越大

    这实际上是一个固定成本与可变成本的问题。建立严格的单元测试可能需要一些时间,但是如果您的项目足够大,您可以将在提高生产力的几个月中花费的时间增加


    一如既往,这取决于项目的具体情况。祝你好运

    涉及数据库的测试不是单元测试

    例如,我只使用DB单元为集成测试设置测试数据。DB Unit是一个很好的工具,但名称不好(包含“Unit”)


    在我们的ContinuousIntegration服务器上,集成测试(也涉及DB)与正常的单元测试在不同的阶段运行。允许在不同升级级别运行检查的afaik称为“分阶段构建”。

    涉及数据库的测试不是单元测试

    例如,我只使用DB单元为集成测试设置测试数据。DB Unit是一个很好的工具,但名称不好(包含“Unit”)


    在我们的ContinuousIntegration服务器上,集成测试(也涉及DB)与正常的单元测试在不同的阶段运行。允许在不同升级级别运行检查的AIK称为“分阶段构建”。

    经常有人争论是否应该将需要数据库的测试称为“单元测试”。答案通常是“不”。我的意见是“是的”。为什么?

    因为服务方法(单元)是经过测试的。这些方法依赖于数据访问层,而数据访问层又依赖于数据库连接。现在,一种纯粹的单元测试方法是模拟依赖关系——在本例中是DAO。这个模拟应该相当复杂,以便按照预期的方式运行。那么,为什么要创建一个复杂的模拟,而不是使用内存中的数据库(HSQLDB/Derby/JavaDB/),它可以作为运行时设置的模拟来实现呢

    现在,问题是,内存中的数据库(逻辑上)非常快。仅此一项就可以将运行测试的时间减少到足够低的水平


    此外,我相信引擎应该能够划分任务:首先使buld(和可交付成果)成为可能,然后运行测试。因此,在日常常见的情况下,您不必等待测试,而结果很快就会出现,足以修复出现的任何错误。

    需要数据库的测试是否应称为“单元测试”经常有争议。答案通常是“不”。我的意见是“是的”。为什么?

    因为服务方法(单位)