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 它让您可以检查一些内容,如记录的信息、请求和响应内容、执行的操作等 简言之,准备好你的应用程序以便于检查
log("Starting transaction for client id %s", id )
始终确保使用良好的日志框架,否则日志将变得无用 契约式设计、单元测试和诸如此类的东西可以帮助您确保一段代码(通常是一个函数)能够正常工作。这很好,但不能取代调试 调试意味着找出为什么代码块不能正常工作。单元测试只能告诉你一个块不能正常工作,它不能告诉你为什么。为了找出原因,您必须逐行遍历代码,跟踪状态与预期不同的地方,或者逻辑意外分支的地方。要跟踪这些东西,您需要在任何给定的时间检查状态。您可以使用
print
语句来实现这一点,使用它们来获取变量状态或推断逻辑分支。调试器是一种工具,可以帮助您在不更改代码的情况下同时执行这两项操作
你必须用其中一个。甚至单元测试基本上也是一个print
语句,它会自动检查正确性,只是在不同的粒度级别
你似乎想让代码自己修复而不去看它。你可以随心所欲地在你的代码周围放置测试和契约,如果这些东西告诉你代码中有一个bug,最终你将不得不查看它。如果您想通过放入
print
语句来检查代码而不改变代码,那么剩下的唯一工具就是调试器。除非有重大突破,否则这就是最新技术。调试器是一种工具,表示我想避免调试器,就像木匠说我想避免锤子一样。您最好问一个问题我什么时候应该避免使用调试器?
应避免使用调试器的次数
- 当您不知道代码在做什么时,请先理解,然后尝试调试,否则会浪费您的时间
- 该问题与时间有关(条件、IPC或线程问题),如果是时间条件,并且您开始单步执行,那么您可能无法重现问题
在35年的编程生涯中,我使用调试器整整三次。从
核心
文件中提取堆栈跟踪的所有三次。av之路