代码之家  ›  专栏  ›  技术社区  ›  Carl

主要方法的Java习惯

  •  6
  • Carl  · 技术社区  · 15 年前

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

    我的一个习惯是在类中使用一个主要的方法来单独测试类的操作。我认为这在某种程度上可能是不好的(毫无疑问,来自自学和科学发展环境的各种其他习惯也是如此)。不过,我注意到,这对自用物品来说从来都不是问题。

    你们是否都愿意确认(或否认)主干线的扩散是发布给科学界的应用程序的一个问题(来源也将是开放的),如果是,为什么?

    编辑:相对于一些提供的答案,扮演魔鬼的拥护者(好吧,我的拥护者):“应用程序使用”的一部分预计是非开发人员(典型科学家)在小范围内修改源代码。我知道,在接收端,将类的测试直接构建到该类中对于我识别和相应地修改(特别是如果类的情况一致的话)是非常简单的。使用类似junit的东西会提供类似的实用程序吗?要记住观众吗?

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

    7 回复  |  直到 13 年前
        1
  •  6
  •   KLE rslite    15 年前

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

    • 通常只有主管道 一种方法,可以变得非常大 ;如果提取仅用于测试的小方法,则在常规代码中使用该方法存在风险。
    • 不会使类本身与测试方法混淆 ,他们在不同的班级
    • 允许在测试中继承 类(主方法,作为静态方法,不可能继承或重用);通常,实际测试之前的设置可能很长,并且自然地重用它是很好的
    • MAIN没有结果(成功或失败),只有输出;您需要 手动检查输出以确定结果 可能理解
    • 允许同时执行多个测试(类、包、项目、全部),即 回归测试所需 (或者你将在下午一个接一个地执行它们)
    • JUnit提供 开箱即用的许多附加功能 例如,将一些测试标记为忽略,检查测试是否太长,提供几个启动uis等。
    • 你可以 在每个实现或子类上重用一些测试 (例如:检查liskov替换),它允许您在不维护大量测试代码的情况下进行大量测试。
        2
  •  12
  •   Bill the Lizard Alexis MP    15 年前

    在自己的主方法中测试类是不好的,因为它给了类额外的责任(测试本身)。测试应该在单独的类中进行,最好使用类似 JUnit .

    主干网的激增(我喜欢你创造的这个短语)也使开发人员在第一次接近应用程序时更难找到它的入口点。

        3
  •  6
  •   JZeeb    15 年前

    首先,你写测试很好。我不太喜欢在项目中的很多类中都有一个主方法。我提倡将测试代码移出并使用测试框架。这样可以保持源代码的整洁,如果您为测试类使用一致的命名方法,那么也很容易找到关联的测试。

        4
  •  3
  •   cletus    15 年前

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

    1. 它可能允许用户做你不想让他们做的事情,或者至少让他们知道他们可以做你不希望他们做的事情;并且
    2. 多产的main()方法通常不能很好地替代单元测试。

    你应该全神贯注。

        5
  •  2
  •   Vincent Ramdhanie    15 年前

    您需要使用JUnit之类的测试工具来对类执行测试,而不是将测试代码插入到生产代码中。

    这样可以将测试与代码清晰地分开。

        6
  •  0
  •   Aaron Digulla    15 年前

    这种方法本身没有什么问题,但有一个主要缺点:您必须调用每个 main() 方法分别测试所有代码。很可能你不会的。只是太模糊了。而且,在这样做的时候,你必须知道 主体() 方法是真正的入口点,哪些是测试点。这一点都不明显。

    使用JUnit和类似的工具,您可以将代码标记为“这是一个测试”。这允许工具自动查找项目中的所有测试,并同时运行所有测试。这样,大多数时候运行所有测试的机会都要大得多,而且bug很早就被捕获了。

        7
  •  0
  •   Andreas Dolk    15 年前

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

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

    啊,我想到的第三个方面是:主要的方法总是公开的,所以您的库的用户可以随时自由地使用这些方法,即使是在执行自己的应用程序时。这可能会产生可怕的副作用,特别是在多线程环境中。