Unit testing 有没有办法避免调试器?

Unit testing 有没有办法避免调试器?,unit-testing,debugging,Unit Testing,Debugging,我不喜欢在调试器中进行调试,因为我认为它通常位于编程语言的抽象层之下,并且通常不可复制。我喜欢在可能的情况下使用单元测试,我认为这是一种很好的方法,但是实现它们并不总是那么容易。您知道其他避免使用调试器的方法吗?想想!:)-不过,说真的,在调试器普及之前,大多数人都会通过向输出设备写入大量状态信息来排除代码故障。它仍然可以工作。任何非平凡的应用程序都应该内置某种日志/跟踪功能。您需要能够打开/关闭各种类型的输出 记录所有输入尤其有用。如果可以“回放”输入,则重现问题会容易得多。就我个人而言,我自

我不喜欢在调试器中进行调试,因为我认为它通常位于编程语言的抽象层之下,并且通常不可复制。我喜欢在可能的情况下使用单元测试,我认为这是一种很好的方法,但是实现它们并不总是那么容易。您知道其他避免使用调试器的方法吗?

想想!:)-不过,说真的,在调试器普及之前,大多数人都会通过向输出设备写入大量状态信息来排除代码故障。它仍然可以工作。

任何非平凡的应用程序都应该内置某种日志/跟踪功能。您需要能够打开/关闭各种类型的输出


记录所有输入尤其有用。如果可以“回放”输入,则重现问题会容易得多。

就我个人而言,我自己很少使用调试器。我通常会发现,我花了太多的时间单步走,在我进入重要的部分之前,通常会弄乱机械

我最喜欢的调试方法是在关键位置添加打印语句。比如,如果一个计算得到了错误的答案,我可能会添加print语句来转储进入计算的值

在Java中,我通常会编写如下内容

System.out.println(“函数foo:bar=“+bar+”,plugh=“+plugh”)

如果问题似乎是程序通过逻辑所走的路径,我将添加打印“即将进入销售计算块”或“已完成写入数据库”之类的语句


只有当我不知道问题是什么的时候,我才会求助于调试器,我想没有什么比通过每一个步骤来找出问题所在更好的方法了。

一种策略是开发一种“调试”模式,在这种模式中,应用程序会公开一些有用的信息,如使用过的资源、http变量、日志、sql语句等

例如,我有一个web应用程序,它通过隐藏的输入来管理网页状态,并通过xml消息与数据库交互

当我给url加上一个“debug=1”时,所有隐藏的输入都显示在一个可折叠的框中,并且执行的xml in和xml out

此外,在调试模式下,我可以双击页面的某个位置查看数据库配置信息,还有一个“模拟”用户的快捷方式,以便测试权限

最后添加的内容之一是一个可折叠的框,它向我显示构建整个页面所需的时间,以及访问数据库所需的时间

在数据库方面,我们处理xml并生成几个sql语句。如果我附加一个xml标记1而不是执行查询,我会得到sql语句。。。所以我可以从sql控制台“调试”存储过程

你可以在几天内开发出所有这些东西,我可以向你保证,这真的是值得的

为了了解和理解我所说的内容,您可以通过symfony框架查看开发人员前端proveide

它让您可以检查一些内容,如记录的信息、请求和响应内容、执行的操作等

简言之,准备好你的应用程序以便于检查

  • 测试!=调试!=伐木
  • 避免使用调试器是不现实的。最终,您必须学习某些调试技术来修复困难的bug
  • 我认为Print linestm是目前最常用的调试方法

    你知道:

      log("Starting transaction for client id %s", id )
    

    始终确保使用良好的日志框架,否则日志将变得无用

    契约式设计、单元测试和诸如此类的东西可以帮助您确保一段代码(通常是一个函数)能够正常工作。这很好,但不能取代调试

    调试意味着找出为什么代码块不能正常工作。单元测试只能告诉你一个块不能正常工作,它不能告诉你为什么。为了找出原因,您必须逐行遍历代码,跟踪状态与预期不同的地方,或者逻辑意外分支的地方。要跟踪这些东西,您需要在任何给定的时间检查状态。您可以使用
    print
    语句来实现这一点,使用它们来获取变量状态或推断逻辑分支。调试器是一种工具,可以帮助您在不更改代码的情况下同时执行这两项操作

    你必须用其中一个。甚至单元测试基本上也是一个
    print
    语句,它会自动检查正确性,只是在不同的粒度级别


    你似乎想让代码自己修复而不去看它。你可以随心所欲地在你的代码周围放置测试和契约,如果这些东西告诉你代码中有一个bug,最终你将不得不查看它。如果您想通过放入
    print
    语句来检查代码而不改变代码,那么剩下的唯一工具就是调试器。除非有重大突破,否则这就是最新技术。

    调试器是一种工具,表示我想避免调试器,就像木匠说我想避免锤子一样。您最好问一个问题我什么时候应该避免使用调试器?

    应避免使用调试器的次数

    • 当您不知道代码在做什么时,请先理解,然后尝试调试,否则会浪费您的时间
    • 该问题与时间有关(条件、IPC或线程问题),如果是时间条件,并且您开始单步执行,那么您可能无法重现问题
    我确信在其他情况下使用调试器是个坏主意,但我的观点是你的问题是错误的。不要问我如何不使用调试器,而是问我什么时候应该/不应该使用调试器


    在35年的编程生涯中,我使用调试器整整三次。从
    核心
    文件中提取堆栈跟踪的所有三次。av之路