Java Habits主要方法

时间:2009-09-17 15:07:26

标签: java

我编写的代码主要供个人使用,但我正在考虑发布一个我最初开发用于个人用途的应用程序(科学模拟/可视化)。

我的一个习惯是在类中使用main方法来单独测试类的操作。我认为这在某种程度上可能是不好的(毫无疑问,其他各种习惯源于自学和科学发展环境)。然而,对于我注意到的自用东西来说,它从来都不是问题。

您是否都非常友好地确认(或否认)主管的扩散对于向科学界发布的应用程序而言是一个问题(来源也是开放的),如果是,为什么?

编辑:相对于一些提供的答案,扮演魔鬼的拥护者(好吧,我的拥护者):部分“应用程序使用”预计将由非开发人员(典型的科学家)进行小规模的源修改。我知道在接收端,对于直接构建到该类中的类进行测试对我来说非常简单,因此我可以相应地识别和修改(特别是如果这些类一直是这样的话)。使用像JUnit这样的东西会提供类似的效用吗,请记住观众?

接受决定:我认为KLE的答案是彻底和简洁的最佳平衡,所以我选择了它,但我认为Bill的讨论评论也非常有帮助。我也不明白为什么约翰内斯的答案被否决 - “这件作品如何运作”的观点对于科学界的编码员来说非常重要 - 而其他答案指出了为什么分离单元测试可能比我的更有用的各种原因目前的习惯,他们并没有真正解决这个问题,所以他的答案远非“无益”。感谢所有当前(和未来)的响应者,并且希望有一种方法可以将多个响应组合为正确的答案!

7 个答案:

答案 0 :(得分:12)

在自己的main方法中测试你的类是不好的,因为它给了类一个额外的责任(测试自己)。测试应该在不同的类中进行,最好使用像JUnit这样的测试库。

主电源的激增(我喜欢你创造的这句话)也让开发人员在第一次接近应用时找到应用的入口点时更加困惑。

答案 1 :(得分:6)

首先,你正在编写测试是很棒的。我真的不喜欢在项目中的许多类中使用main方法的方法。我主张将测试代码移出并使用测试框架。这使源代码更加清晰,如果您对测试类使用一致的命名方法,也很容易找到相关的测试。

答案 2 :(得分:6)

JUnit可让您进行测试,就像您的主电源一样,但也可以:

  • 主要通常只有一种方法,可以变得很大;如果提取仅用于测试的小方法,则在常规代码中使用该方法存在风险
  • 不会使用测试方法使类本身混乱,它们属于不同的类
  • 允许在测试类中继承(main,作为静态方法,不可能继承或重用);通常,实际测试之前的设置可能很长,并且自然地重复使用它很好
  • 主要没有结果(成功或失败),只有输出;你需要手动检查输出以确定结果,并且可能理解它
  • 允许同时执行多个测试(类,包,项目,所有),这是回归测试所需(或者您将在下午逐个执行它们)
  • JUnit提供了开箱即用的许多其他功能,比如将某些测试标记为忽略,检查测试不会太长,提供多个启动UI等。
  • 你可以在每个实现或子类上重用一些测试(例如:检查Liskov替换),它允许你在不保留大量测试代码的情况下进行大量测试。

答案 3 :(得分:3)

这并不可怕,但不建议这有两个原因:

  1. 它可能允许用户做你不希望他们做的事情,或者至少让他们知道他们可以做一些你宁可做的事情;和
  2. 多产的main()方法通常不能替代单元测试。
  3. 这是(2)你应该真正专注于。

答案 4 :(得分:2)

您需要使用JUNIT等测试工具对类进行测试,而不是将测试代码插入到生产代码中。

这样可以将测试与代码完全分开。

答案 5 :(得分:0)

这种方法本身没有任何问题,但有一个主要缺点:您必须单独调用每个main()方法来测试所有代码。你可能不会。这太多了。此外,在执行此操作时,您必须知道哪些main()方法是真正的入口点,哪些是测试。这根本不是显而易见的。

使用JUnit和类似工具,您可以将代码标记为“这是一个测试”。这允许工具自动查找项目中的所有测试并立即运行所有测试。通过这种方式,您可以在大多数情况下运行所有​​测试,并且可以及早发现错误。

答案 6 :(得分:0)

我也不会在所有类中使用main方法进行测试。首先,遵循关注点分离规则(使用和测试是不同的关注点),因为我们有优雅的测试解决方案。

其次,到目前为止还没有提到过,如果每个类都有一个main方法,那么很难找到应用程序中的“真实”入口点。如果我看到一个带有main方法的类,我希望这会让我以预期的方式“使用”该类。我不指望,这将开始一个测试用例(可能有严重的副作用)。

啊,只是我想到的第三个方面:主要方法总是公开的,因此您的库的用户可以随时使用这些方法,甚至可以在执行他自己的应用程序时使用这些方法。这可能会产生可怕的副作用,尤其是在多线程环境中。