如果只花很长时间测试代码,如何有效编程?


16

我的工作流程一直是编写一个逻辑步骤,然后运行程序并检查输出。这个过程非常适合我在大学中的作业。但是,随着我进行更多的开发,通常仅编译和运行代码就需要1-2分钟的时间。示例包括将程序上载到微控制器,需要与外部服务器进行交互以及由于身份验证,软件体系结构或复杂性而无法实现自动化。

这些类型的任务非常不适合我通常的编程方式,并且我在有效编码方面遇到困难。我通常会犯很多语法错误和逻辑错误,其中大部分我很容易通过测试发现。但是,由于等待时间如此长,因此此方法非常耗时。


您正在使用IDE吗?
Woot4Moo 2011年

3
您的根本问题不是无法有效编码,而是测试花费了太长时间才能运行。您在问错问题。
Rein Henrichs

使用具有REPL的语言。
罗伯特·哈维

您是否有可以问及向其学习的同事?
user985366

Answers:


25

首先,任何形式的交互式调试都很棒。您希望在工具包中拥有它,因为如果还没有,那么总有一天您会真正从中受益。(详细信息因语言,平台和IDE而异。)

需要与外部服务器进行交互,并且由于身份验证,软件体系结构或复杂性而无法实现自动化。

我将研究一些使用模拟对象的框架。这些使您可以用其他组件的伪生态系统包围要测试的组件,从而使测试更具针对性,并且可以避免对整个单元进行尽可能多的测试。

此外,可以使用断言对模拟对象本身进行编程,因此您可以检查经过测试的组件是否确实进行了某个调用。


12

我会努力减少测试时间。我曾在几家公司工作,开发嵌入式代码,并且测试很痛苦,需要到服务器机房旅行,手动FTP和重新启动以及对测试硬件的多个命令。然后,我加入了一个非常出色的小组,在那里我可以在办公桌上简单地输入“ make test”,然后在一分钟内得到结果。在那一分钟内:

  • 我的代码已内置到嵌入式硬件的新内核映像中。
  • DHCP服务器已更新为指向新内核。
  • 测试板重新启动。
  • 测试板通过NFS挂载从我的工作站中检索了内核。
  • 测试板重新启动到新内核。
  • 运行了单元测试。
  • 单元测试输出已传递回我的工作站。

所有这些工作都花了一些时间,但是随着开发人员的增加,使所有这些步骤自动化的努力被收回了一百倍。


2
+1。没有足够数量的Shell脚本无法解决的问题。
Tom Anderson

1
我不会留在那些不关心提高速度的团队中。
凯文·克莱恩

@Tom除去过多的摘要,shell脚本;)
Darien

不,您只需编写一个包含其他Shell脚本的Shell脚本。然后只有一个shell脚本。相信我。
Tom Anderson

3
+1:提高编辑->编译->加载->运行->调试->编辑的速度是提高代码生成速度的最佳方法。当我在Tymshare工作时,我们有一个人(正确地)声称他的代码在87%的首次尝试中都能正确运行。另一方面,我的编码就像我在凌晨1点(对我)在咖啡因猴子上过量服用。我犯了很多错字错误等,但我并不担心它们,因为我知道编译器会捕获它们。最终,我的生产力可能是他的3到5
Peter Rowell

8

自动化测试不能代替审查和理解。

可能是您将测试用作拐杖。如果您这样做,将会阻碍您的学习。我不是在提倡您不要测试。相反,我建议您在运行测试复查之前写的内容。了解您写的内容,确保它有意义,并确保语法看起来正确。


5

您已经给出了答案: I usually make a lot of syntax errors and logic errors

因此,努力改进它,您应该能够减少测试时间。应该首先减少语法错误。您的学习中从来没有用纸和铅笔进行编程测试吗?

从PHP切换到Java时,我遇到了同样的事情。我必须学习调试,而不仅仅是打印一些变量并在浏览器中按F5键。


2
我们都会不时犯一些愚蠢的错误,它们只会随着时间和经验而减少。
maple_shaft

@maple_shaft没错,但是当他说make a lot of听起来像他应该投入自己的精力来改善它时
WarrenFaith 2011年

3
我在纸上和白板上做了很多编码。问题是相同的:代码在第一次检查时看起来正确,但是在运行它之后,您会注意到您的错误。
Anne Nonimus 2011年

注意代码错误和使用错误语法编写代码有很大的不同。第一个可以发生在每个人身上,第二个则建议初学者。我不知道您的背景,但是即使是初学者,也应尽量减少语法问题。您的IDE和语言是什么?它应该支持语法检查。
WarrenFaith 2011年

@Anne Nonimus:您的意思是逻辑错误吗?语法错误应由您的IDE处理(理想情况下-如果您使用的是动态生成的代码,则这些语法错误将不会在编译时被处理)。
FrustratedWithFormsDesigner

4

您需要一个良好的单元或功能测试平台,可以自动为您运行测试,最好是在后台运行。这将需要使用上述Mocks,并取决于您使用某种依赖注入的语言。

通过使对象尽可能独立,然后使用注入方法添加外部约束,为代码创建测试平台并不困难。


2

当您只是因为愤怒而无法测试代码时,真正的乐趣就来了。在交易系统中,这种情况经常发生,因为可用的交易模拟器通常要么很差,根本不存在,要么甚至不符合交易软件供应商所说的那样。恐怕这是生活丰富的挂毯的一部分。我的方法是确保交易的至少我这一边写得好并且有据可查,以便可以轻松快速地进行更改。


3
您“交换”和“交易”软件工程师是一个独特的品种。我的朋友在一家这样的公司工作时遇到了一系列精神崩溃。我从来没有听说过软件行业的利基市场会带来好运。
maple_shaft

@maple好吧,我本人不再这样做。但是独特?不,任何人都可以编写糟糕的代码,并且大多数交易代码都非常糟糕。但是,不管喜欢与否,这是我们社会的基础。
尼尔·巴特沃思

是的,关于电信代码以及交换机控制软件中有几百万条线路,我听到了同样的话。然后我加入了一家电信公司,意识到如果他们雇用了一些程序员,那么数千行就足够了。
凯文·克莱恩

2

单元测试;模拟应用程序/模拟器。

理所当然,这需要时间,您可能需要收集并整理样本数据以创建适当的模型,但最终会获得回报:您将节省所有时间,并在尝试进行外部测试时遇到麻烦系统。

正确使用这些工具将确保在您前往外部系统附近之前,您有99.9%的把握确保如果代码失败,则是导致外部系统/环境变化的原因,而不是您自己的代码中的错误。

我很专业地工作了一段时间,就像他们在学校所做的那样,而且在许多情况下,它非常有效。最终,我在某些人的帮助下工作,这些人迫使我放弃了这种方法,而改用单元测试和模型。

现在,在没有首先考虑测试阶段(单元测试,模型,模拟器,样本数据等)的实现之前,我不会开始任何项目。


1

我通常会犯很多语法错误和逻辑错误

也许使用Linter可以在这里有所帮助。

我以前的雇主也遇到过类似的情况。我们的代码库非常庞大,可以进行任何我必须编写的代码,进行编译,然后替换.class开发服务器中的文件,然后使用重新启动脚本重新启动开发服务器。令我沮丧的是,大约需要半小时才能恢复开发服务器。

后来我发现远程调试开发服务器也是可行的。

所以这是我为优化流程所做的

  • 远程调试的第一轮初始调试,这使我可以看到确切的代码流和变量的确切值/状态。

  • 计划如何以及将进行哪些更改。

  • 进行更改,然后比较差异

  • 通过使用linter或通过编译来缓存错误。

  • 通过替换.class文件并重新启动来提供热修复。

有时我还会包含大量的日志语句,以再次检查代码流并检查值/状态。这确实对我有很大帮助。

同样,使用具有良好自动复杂性的IDE可以极大地减少错别字。

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.