如何最好地测试Java代码?

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

PS:我有两个具体问题:如何测试私人function? 如何测试界面并避免副作用?

以下是两个可能有用的网站:

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

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

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

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

编辑:另外,如果您还没有进行unit testing,请查看使用旧版代码进行有效工作 ; 它是测试代码的必要条件,这些代码没有很好地用于测试。

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

至于你的具体问题:一般来说,你不应该使用unit testing来测试私人function; 如果他们是私人的,他们就是私人的。 如果您需要测试某些东西,请测试使用该私有方法执行某些操作的公共方法。 避免可能存在问题的副作用最好使用完整的测试环境(可以很容易地回到“处女”状态)或使用模拟,如上所述。 测试接口是通过测试接口方法完成的。

首先,如果您已经拥有一个没有任何unit testing的大型系统,并且您计划添加一些,那么请允许我提供一些一般性建议。

从维护系统并使用它开始,你可能已经知道系统中哪些区域往往是最缓慢的,这些区域往往会经常变化而且往往不会发生太大的变化。 如果不这样做,您可以随时查看源代码管理日志(您正在使用源代码管理,对吧?),以找出大多数错误修复和更改集中的位置。 将测试工作集中在这些类和方法上。 有一个称为80/20规则的一般规则适用于各种事物,这是其中之一。

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

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

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

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

您可以查看此列表: 用于数据库中心Java应用程序的回归测试/测试自动化的工具? 有关有趣工具的列表。

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

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

之前给出的工具列表很有用。 从个人经验来看,这些是我觉得有用的工具:

模拟Mockito是一个很好的实现,并有巧妙的技术,以确保你只需要模拟你真正关心的方法。

数据库测试 – DBunit对于设置测试数据和validation数据库交互是不可或缺的

压力测试 – Jmeter – 一旦你看到通过略显笨重的gui,这是一个非常强大的工具,用于设置场景和运行压力测试。

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

虽然这种级别的测试应该是次要的良好unit testing。

祝你好运!