【问题标题】:How to best test Java code?如何最好地测试 Java 代码?
【发布时间】:2009-07-16 17:38:48
【问题描述】:

我一直在自己开发一个比较大的系统,这是我第一次开发一个大型系统(同时处理 200 多个信息通道)。我知道如何使用 Junit 来测试每种方法,以及如何测试边界条件。但是,对于系统测试,我需要测试所有的接口,可能还需要一些压力测试(也许还有其他事情要做,但我不知道它们是什么)。我是测试领域的新手,请给我一些建议或指出一些关于优秀代码测试人员如何进行系统测试的信息。

PS:我有 2 个具体问题是: 如何测试私有函数? 如何测试接口并避免副作用?

【问题讨论】:

    标签: java testing interface junit


    【解决方案1】:

    这里有两个网站可能会有所帮助:

    第一个是open source Java tools 的列表。许多工具都是 JUnit 的插件,可以更轻松地进行测试或在更高的集成级别进行测试。

    根据您的系统,有时 JUnit 可以用于系统测试,但测试的结构可能会有所不同。

    至于私有方法,请查看this question(以及它引用的问题)。

    您无法测试接口(因为没有行为),但您可以创建一个抽象基测试类来测试接口的实现是否遵循其约定。

    编辑:另外,如果您还没有单元测试,请查看Working Effectivly with Legacy Code;对于没有为测试设置良好的代码,这是必须的。

    【讨论】:

    • 我刚刚订购了这本书。谢谢。
    【解决方案2】:

    Mocking 是一种能够在单元测试中模拟系统测试的好方法;通过替换(模拟)其他组件所依赖的资源,您可以在“类似系统”的环境中执行单元测试,而无需构建整个系统来执行它。

    至于您的具体问题:通常,您不应该使用单元测试来测试私有功能;如果它们是私有的,则它们对班级是私有的。如果您需要测试某些内容,请测试使用该私有方法执行某些操作的公共方法。避免可能有潜在问题的副作用最好使用完整的测试环境(可以很容易地被抹回“原始”状态)或使用模拟,如上所述。测试接口是通过测试接口方法来完成的。

    【讨论】:

      【解决方案3】:

      首先,如果您已经有一个没有任何单元测试的大型系统,并且您打算添加一些测试,那么请允许我提供一些一般性建议。

      通过维护系统和使用它,您可能已经知道系统的哪些区域容易出错,哪些区域经常变化,哪些区域变化不大。如果您不这样做,您可以随时查看源代码控制日志(您正在使用源代码控制,对吗?)以找出大多数错误修复和更改集中在哪里。将您的测试工作集中在这些类和方法上。有一个通用规则叫做 80/20 规则,它适用于整个范围的事物,这就是其中之一。

      它说,大约平均而言,您应该能够通过仅完成 20% 的工作来处理 80% 的违规案例。也就是说,只需为 20% 的代码编写测试,您就可以捕获 80% 的错误和回归。这是因为大多数脆弱的代码、经常更改的代码和最糟糕的代码只占代码库的 20%。事实上,它可能会更少。

      您应该使用 junit 来执行此操作,并且应该使用 JMock 之类的东西或其他一些模拟库来确保您在隔离测试。对于系统测试/集成测试,即在它们一起工作的同时进行测试,我可以推荐FitNesse。我过去在这方面有很好的经验。它允许您使用简单的类似表格的布局在 Web 浏览器中编写测试,您可以在其中轻松定义输入和预期输出。您所要做的就是编写一个称为 Fixture 的小支持类,它处理组件的创建。

      【讨论】:

        【解决方案4】:

        私有函数将在调用它们的公共函数时进行测试。您对公共函数的测试只关心返回的结果是否正确。

        在处理 API(与其他包或 URL 甚至文件/网络/数据库)时,您应该模拟它们。一个好的单元测试应该在几毫秒而不是几秒钟内运行。模拟是唯一的方法。这意味着包之间的错误可以比功能级别的逻辑错误更容易处理。对于 Java,easymock 是一个非常好的模拟框架。

        【讨论】:

          【解决方案5】:

          您可以查看此列表:Tools for regression testing / test automation of database centric java application? 以获得有趣的工具列表。

          由于您似乎已经广泛使用 Junit,这意味着您已经“测试感染”,这是一个很好的观点...

          以我个人的经验,最难管理的是数据。我的意思是,非常敏锐地控制运行测试的数据。

          【讨论】:

            【解决方案6】:

            前面给出的工具列表很有用。根据个人经验,这些是我认为有用的工具:

            Mocking - Mockito 是一个出色的实现,并且具有巧妙的技术来确保您只需要模拟您真正关心的方法。

            数据库测试 - DBunit 对于设置测试数据和验证数据库交互是必不可少的。

            压力测试 - Jmeter - 一旦您通过了略显笨拙的 gui,这是一个非常强大的工具,用于设置场景和运行压力测试。

            至于一般方法,首先尝试通过您的应用程序为通常的“快乐路径”运行测试,这些可以构成回归测试和性能测试的基础。完成后,您可以开始查看边缘情况和错误场景。

            虽然这个级别的测试应该次于良好的单元测试。

            祝你好运!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-12-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多