如果不能测试局部变量那么还有什么其他方法可以检查变量值

if local variables cant be tested then what other ways can the variable values be checked

这将是一个很长的问题,因为想知道某些东西是如何与传统方法相悖的。

我发现了一个非常有趣的应用程序 codeacademy,它实际上是在 main 方法中测试局部变量。 这是该页面的屏幕截图,它让我开始思考这怎么可能。 在Whosebug中发现了一些类似的问题。

How to use BCEL or ASM to get the value of a local declared variable in JAVA?

我不满足于知道它不能完成,我想知道的是,有没有办法,比如 java 编译器 api 或其他一些,可以让我知道如何制作这样的应用程序是可能的。

可能是我们想多了。

当我收到你的问题时,你想知道这里使用的在线工具如何知道一些main()方法中变量的内容

事实是:这不一定是 Java 功能。

请记住:这是他们的 网络应用程序。他们可以做他们在那里实施的任何事情。换句话说:您当然可以使用 Java 编译器生成 any 段 Java 代码的 AST(抽象语法树)表示。当然,该 AST 包含相应源代码中存在的所有信息。

在实现验证(如单元测试或 QA 自动化测试)中测试局部变量通常是不好的做法。

局部变量取决于特定的实现,特定的实现应该隐藏在合理抽象的后面API,以允许开发人员在未来替换实现——如果他们有更好的想法——而不影响消费者结果(只要 API 非常好,就不需要任何更改)。

对于一些非常复杂的 implementations/algorithms 开发人员确实可能有兴趣验证复杂算法的特定 intermediate/inner 结果,以使实现本身的开发更容易。在这一点上,创建内部 inner-API 提供合理抽象的中间结果是有意义的,即使它们与特定算法硬绑定,并在单元测试中测试该 inner-API 。但是在算法替换的情况下,您必须接受内部 API 和所有内部单元测试的更改。仍然应该有合理的高级抽象API,不受内部变化的影响。

需要在局部变量级别进行测试应该表明代码库存在一些更深层次的问题。


您的 Java 教程的特定用例与真正的 Java 代码开发完全无关,因为该讲座的目的完全不同。

正如简单的 myNumber = 21 + 21; 测试所示,讲座的验证完全基于比较文本,可能对学生输入的源代码使用了一些正则表达式。甚至不检查生成的字节码,因为那个字节码与 myNumber = 42;.

相同

如果您正在处理一些讲座系统,使用某种自定义虚拟机和调试界面可能会奏效,但对于简单的讲座,即使是文本比较解决方案也可能就足够了。

通常当学生的水平足以解决一些任务时,您可以开始使用 input/output from/to stdin/stdout 创建自动化测试以使用一组已知的 input/output 测试,就像 https://www.hackerrank.com/ 等网站所做的那样,或者各种编程竞赛。那时你不需要访问任何东西,也不需要局部变量,也不需要 API 单元测试,你只需将标准输入重定向到具有所需输入的解决方案,并捕获标准输出以将其与设计输出进行比较。


但是讲座验证与单元测试完全无关。

而对预期结果过于严格的测试甚至可能在讲课过程中适得其反!

假设你让学生编写代码输出从 1 到 N 的平方和,你将只接受:

    int sum = 0;
    for (int i = 1; i <= N; ++i) {
        sum += i * i;
    }

(在字节码级别验证,变量名称和 ++ suffix/prefix 无关紧要)

现在有些学生会尝试提交这个:

    int sum = 0, square = 0, sq_delta = -1;
    for (int i = 1; i <= N; ++i) {
        sum += (square += (sq_delta += 2));
    }

它会失败...(即使他的解决方案在 1985 年左右绝对优于实际乘法的变体)...悲伤的故事。 :)