代码之家  ›  专栏  ›  技术社区  ›  Gordon Gustafson

我应该把我的课程测试代码放在哪里?

  •  4
  • Gordon Gustafson  · 技术社区  · 15 年前

    所以我写了一个类,我有代码来测试它,但是我应该把代码放在哪里呢?我可以为类创建一个静态方法test(),但在生产过程中不需要这样做,这样会导致类声明混乱。有点搜索告诉我将测试代码放到一个单独的项目中,但是该项目的格式究竟是什么?一个静态类,每个类都有一个方法,所以如果我的类被称为随机化器,那么这个方法将被称为TestRandomizer?

    关于组织测试代码,有哪些最佳实践?

    编辑:我最初用我认为与之相关的各种语言标记问题,但似乎问题的总体答案可能是“使用特定语言的测试框架”。D

    10 回复  |  直到 15 年前
        1
  •  4
  •   Danny Varod    15 年前

    无论您使用的是测试框架(我强烈推荐这样做),或者没有,单元测试的最佳位置是在单独的程序集(C/C++/C/A)或包(Java)中。

    您只能访问公共和受保护的类和方法,但是单元测试通常只测试公共API。

    我建议为每个现有项目/程序集/程序包添加单独的测试项目/程序集/程序包。

    项目的格式取决于测试框架——对于.NET测试项目,在VS版本中使用VSS内置的测试项目模板或NUnit不支持单元测试,对于Java使用JUnit,对于C/C++可能是CppUnit(我还没有尝试过这一个)。

    测试项目通常包含一个静态类初始化方法、一个静态类分解方法、一个用于所有测试的非静态初始化方法、一个用于所有测试的非静态分解方法和一个用于每个测试的非静态方法+您添加的任何其他方法。

    静态方法允许您复制DLL、设置测试环境和清除测试环境,非静态共享方法用于减少重复代码,实际测试方法用于准备特定于测试的输入、预期输出和比较。

        2
  •  3
  •   jfawcett    15 年前

    测试代码放在哪里取决于您打算对代码做什么。例如,如果它是一个独立的类,您打算让其他人可以下载和使用它,那么测试代码应该是解决方案中的一个项目。测试代码除了提供对类正在做您希望它做的事情的验证之外,还将为您的类的用户提供一个示例,因此它应该有良好的文档记录并且非常清楚。

    另一方面,如果您的类是库或dll的一部分,并且只在该库或dll的生态系统中工作,那么应该有一个测试程序或框架将该dll作为一个实体来执行。代码覆盖工具将证明测试代码实际上正在执行代码。根据我的经验,这些测试程序和单类程序一样,是作为构建DLL或库的解决方案中的项目构建的。

    注意,在上述两种情况下,测试项目不是作为标准构建过程的一部分构建的。你必须专门建造它。

    最后,如果您的类要成为一个更大项目的一部分,那么您的测试代码应该成为为您的更大团队定义的任何框架或流程的一部分。例如,在我当前的项目中,开发人员单元测试维护在一个单独的源代码控制树中,该树的结构与发货代码的结构类似。单元测试需要通过开发和测试团队的代码审查。在构建过程中(现在每隔一天),我们构建发货代码,然后单元测试,最后是QA测试代码集。单元测试在QA代码之前运行,所有测试都必须通过。这几乎是一个烟雾测试,以确保我们没有破坏最低级别的功能。单元测试需要生成一个故障报告,并以一个负的状态代码退出。不过,我们的流程可能比许多流程更正式。

        3
  •  2
  •   peter.murray.rust    15 年前

    在爪哇,你应该使用JunIT4,或者用IDE本身(或者我认为更好)。我们使用了三种环境:Eclipse、NetBeans和Maven(带和不带IDE)。如果没有系统地部署,它们之间可能存在一些轻微的不兼容性。

    通常,所有测试都在同一个项目中,但在不同的目录/文件夹下。因此,一个类:

    org.foo.Bar.java
    

    会有个测试

    org.foo.BarTest.java
    

    它们在同一个包(org.foo)中,但将在目录中组织:

    src/main/java/org/foo/Bar.java 
    

    src/test/java/org/foo/BarTest.java 
    

    这些目录被Eclipse、NetBeans和Maven普遍识别。Maven是最挑剔的,而Eclipse并不总是严格执行。

    您可能应该避免调用其他类testplugh或xyzzytest,因为有些(旧的)工具会将这些类作为包含测试的工具,即使它们不包含测试。

    即使您的方法只有一个测试(并且大多数测试机构都希望更多的测试用例),您也应该安排这种类型的结构。

    编辑 注意,即使Maven在同一个包中,也可以在不进行测试的情况下创建分发。默认情况下,maven还要求在部署项目之前通过所有测试。

        4
  •  1
  •   Kevin LaBranche    15 年前

    我看到或使用的大多数设置都有一个单独的项目,其中包含测试。这使得它更容易和清洁的工作。作为一个单独的项目,可以轻松地部署代码,而不必担心测试是实时系统的一部分。

    随着测试的进展,我看到了单元测试、集成测试和回归测试的单独项目。其中一个主要的想法是尽可能快地运行单元测试。由于测试的性质(连接到数据库等),集成和回归测试往往需要更长的时间。

        5
  •  1
  •   Willie Wheeler    15 年前

    我通常在同一个项目的不同源代码树中创建一个并行包结构。这样,您的测试就可以访问被测试类的公共成员、受保护成员甚至包私有成员,这通常很有用。

    例如,我可能

    myproject
        src
            main
                com.acme.myapp.model
                    User
                com.acme.myapp.web
                    RegisterController
            test
                com.acme.myapp.model
                    UserTest
                com.acme.myapp.web
                    RegisterControllerTest
    

    Maven做到了这一点,但这种方法与Maven没有特别的联系。

        6
  •  0
  •   Vincent Ramdhanie    15 年前

    这将取决于您使用的测试框架。朱尼特,努尼特,其他人?每个人都会记录一些组织测试代码的方法。另外,如果您使用的是连续集成,那么这也会影响您将测试放在哪里以及如何放置。例如, this article 讨论一些选项。

        7
  •  0
  •   ChrisF    15 年前

    在与代码相同的解决方案中创建新项目。

    如果您使用的是C,则如果您选择“测试”>“新建测试”,则Visual Studio将为您执行此操作…它有一个向导将指导您完成整个过程。

        8
  •  0
  •   Ilya Khaprov    15 年前

    嗯,你想测试随机数生成器…也许最好能创建强有力的数学证明,证明算法的正确性。否则,必须确保生成的每个序列都具有所需的分布

        9
  •  0
  •   Rasmus Faber    15 年前

    为单元测试、集成测试和功能测试创建单独的项目。即使您的“真正的”代码有多个项目,您也可以为每个测试类型使用一个项目,但是区分每种类型的测试是很重要的。

    对于单元测试,您应该创建一个并行的名称空间层次结构。所以,如果您有crazy.juggler.drummer.customer,您应该在crazy.juggler.drummer.customer test中对其进行单元测试。这样就很容易看出哪些类是经过适当测试的。

    功能和集成测试可能很难放置,但通常您可以找到合适的位置。数据库层的测试可能属于像my.app.database.databaseintegrationtest这样的地方。功能测试可能保证它们自己的命名空间:my.app.functional tests.customerCreationWorkflowTest。

    但是提示1:对于分离不同类型的测试要很难。尤其要确保单元测试的集合与集成测试分开。

        10
  •  0
  •   jdecuyper    15 年前

    对于C和Visual Studio 2010,可以创建 test project from the templates 这将包含在项目的解决方案中。然后,您将能够指定在项目构建期间要触发的测试。所有测试将在单独的程序集中进行。

    否则,您可以使用 NUnit Assembly ,将其导入到解决方案中,并开始为需要测试的所有对象创建方法。对于更大的项目,我更喜欢将这些测试定位在单独的程序集中。

    您可以生成自己的测试,但我强烈建议您使用现有的框架。