我们已经尝试过:表明设计变得更简单显示它可以防止缺陷说只有不好的程序员不做才是自负的事情本周末,两名团队成员不得不上班,因为他的代码具有NULL引用,并"/>

关于单元测试:如何使初级程序员编写测试?

关于单元测试:如何使初级程序员编写测试?

How to make junior programmers write tests?

我们有一个初级程序员,根本没有编写足够的测试。
我必须每两个小时na一下他,"你写考试了吗?
我们已经尝试过:

  • 表明设计变得更简单
  • 显示它可以防止缺陷
  • 说只有不好的程序员不做才是自负的事情
  • 本周末,两名团队成员不得不上班,因为他的代码具有NULL引用,并且他没有对其进行测试

我的工作需要质量稳定的顶级代码,通常每个人都'得到它',并且无需进行测试。我们知道可以让他编写测试,但是我们都知道有用的测试是您参与其中时进行的测试。

您知道更多动机吗?


这是最难的事情之一。让你的人得到它。

有时候,帮助初级程序员"掌握它"并向年长者学习正确技术的最佳方法之一就是做一些结对编程。

尝试一下:在一个即将到来的项目中,将初级人员与您自己或其他高级程序员配对。他们应该一起工作,轮流"驾驶"(在他们的键盘上打字)和"教练"(在驾驶员的肩膀上望着,并指出建议,错误等)。似乎浪费资源,但您会发现:

  • 这些家伙在一起可以快速产生高质量的代码。
  • 如果您的初级人员学到了足够的知识,可以与高级人员一起按正确的方向进行操作(例如,"好吧,现在我们继续操作,让我们编写此功能的测试文件。")值得您投入的资源。
  • 也许您的团队中有人在凯特·罗德斯(Kate Rhodes)的单元测试101演讲中发言,我认为这是一种很好的方式,可以使人们对测试感到兴奋,如果交付得当的话。

    您可以做的另一件事是让您的Jr. Devs练习保龄球游戏Kata,这将帮助他们学习测试驱动开发。它是用Java编写的,但是可以很容易地适应任何语言。


    在每次提交之前都要进行一次代码审查(即使这是1分钟的"我已经更改了此变量名"),并且作为代码审查的一部分,审查所有单元测试。

    在测试到位之前,不要签署提交。

    (也-如果未对他的作品进行测试-为什么首先要在生产版本中使用它?如果未对其进行测试,则不要放进去,那么您就没有了周末工作)


    对于我自己,我已经开始坚持将发现和修复的每个错误都表示为一项测试:

  • "嗯,那是不对的... "
  • 发现可能的问题
  • 编写测试,表明代码失败
  • 解决问题
  • 证明新代码通过了
  • 如果原始问题仍然存在,则循环播放
  • 我什至在敲出东西的时候也尝试这样做,而且我大约是在同一时间完成的,只是已经有了部分测试套件。

    (我不是生活在商业编程环境中,通常是唯一从事特定项目的编码器。)


    想象一下我是一个模拟程序员,名为... Marco。想象一下,我不久前才毕业,从来没有真正写过测试。想象一下,我在一家没有真正执行或要求这样做的公司里工作。好的?好的!现在想象一下,该公司正在切换到使用测试,并且他们正试图使我对此保持一致。到目前为止,我将对所提到的项目做出一些棘手的反应,好像我对此没有做任何研究。

    让我们从创建者开始:

    Showing that the design becomes simpler.

    如何编写更多内容,使事情变得更简单。我现在必须密切注意获取更多案件,等等。如果您问我,这将使其变得更加复杂。请给我详细的信息。

    Showing it prevents defects.

    我知道。这就是为什么它们被称为测试。我的代码很好,并且检查了问题,所以看不到这些测试有什么帮助。

    Making it an ego thing saying only bad programmers don't.

    哦,所以您认为我是一个糟糕的程序员,只是因为我没有做太多的二手测试。我被侮辱了,对你很生气。我宁愿获得帮助和支持,也不愿说俗话。

    @Justin Standard: On start of new propect pair the junior guy up with yourself or another senior programmer.

    哦,这是如此重要,以至于将花费大量资源来确保我了解事情的完成方式,并为我提供一些帮助。这很有用,我可能会开始做更多事情。

    @Justin Standard: Read Unit Testing 101 presentation by Kate Rhodes.

    啊,那是一个有趣的演示,它使我想到了测试。它锤击了我应该考虑的一些观点,并且可能使我的观点有些摇摆。

    我希望看到更多引人入胜的文章,以及其他工具来帮助我与认为这是正确的做事方法保持一致。

    @Dominic Cooney: Spend some time and share testing techniques.

    啊,这可以帮助我了解我对技术的期望,并将更多的知识放在我的知识包中,以便我再次使用。

    @Dominic Cooney: Answer questions, examples and books.

    让关键人物(人)回答问题会有所帮助,这可能会让我更有可能尝试。好的例子是很棒的,它给了我一些目标和参考。与这直接相关的书籍是很好的参考。

    @Adam Hayle: Surprise Review.

    说什么,您弹了一些我完全没有准备的东西。我对此感到不舒服,但会尽力而为。现在,我将对此再次感到害怕和不安,谢谢。但是,这种恐吓策略可能奏效了,但确实要付出代价。但是,如果没有其他效果,则可能只是需要进行的推动。

    @Rytmis: Items are only considered done when they have test cases.

    哦,有趣。我知道我确实必须立即执行此操作,否则我将无法完成任何操作。这是有道理的。

    @jmorris: Get Rid / Sacrifice.

    强光,强光,强光-我有机会学习,在支持和协助下,我可以成为团队中非常重要且功能强大的一部分。这是我现在的障碍之一,但是不会太久。但是,如果我不明白我的意思,我会去的。我想我会明白的。

    最后,在所有这一切中,我团队的支持发挥了很大作用。总是请一个人花些时间来帮助我,让我开始养成良好的习惯。然后,以后拥有一个良好的支持网络将是很棒的。总是有人会再来几次,并翻阅一些代码,以查看一切是如何进行的,而不是在评论中本身,而是在友好的访问中,总是很高兴的。

    推理,准备,教学,跟进,支持。


    我已经注意到,许多程序员在合理的水平上看到了测试的价值。如果您听说过"是的,我知道我应该对此进行测试,但我确实需要尽快完成此操作",那么您就知道我的意思了。但是,从情感上讲,他们认为只有在编写实际代码时,他们才能完成工作。

    那么,目标应该是使他们以某种方式理解测试实际上是衡量某项"完成"的唯一方法,从而赋予他们编写测试的内在动力。

    我恐怕要比想做的难得多。您会听到很多借口,例如"我真的很着急,稍后我会重写/重构然后添加测试",当然,后续工作永远不会发生因为令人惊讶的是,他们下周也很忙。


    这就是我要做的:

    • 第一次出去... "我们将共同做这个项目。我要编写测试,而你要编写代码。请注意我如何编写测试,这就是我们在这里做事的方式,也是我对您的期望。"

    • 在此之后... "您完成了吗?太好了!首先让我们看看推动您发展的测试。哦,没有测试?让我知道何时完成,我们将重新计划您的代码。如果您在制定测试方法方面需要帮助,请告诉我,我会为您提供帮助。"


    n


    作为一个初级程序员,我仍在尝试养成编写测试的习惯。显然,要养成新习惯并不容易,但是考虑到什么会使我工作起来,我必须1关于代码审查和辅导/结对编程的评论。

    也许值得强调测试的长期目标:确保昨天,今天,下周和下个月仍然有效。我之所以这么说,是因为在浏览答案时,我没有看到提到的内容。

    在进行代码审查时(如果您决定这样做),请确保您的年轻开发人员知道这不是要放下他,而是要使代码变得更好。因为那样,他的信心不太可能受到损害。这很重要。另一方面,知道自己的知识也是如此。

    当然,我什么都不知道。但我希望这些词有用。

    Edit: [Justin Standard]

    Don't put yourself down, what you have to say is pretty much right on.

    On your point about code reviews: what you will find is that not only will the junior dev learn in the process, but so will the reviewers. Everyone in a code review learns if you make it a collaborative process.


    我自己是一名初级程序员,所以我想表明我发现自己和初级开发人员处于类似情况时的感觉。

    当我第一次离开uni时,我发现它严重地使我无法应对现实世界。是的,我知道一些JAVA基础知识和一些哲学(不要问),但是仅此而已。当我第一次上班时,至少可以说有点令人生畏。让我告诉您,我大概是周围最大的牛仔之一,我会整理一些漏洞修复/算法(不加注释/测试/文档),然后将其发布出去。

    我很幸运能在一个友好而耐心的高级程序员的监督下。对我来说幸运的是,他决定和我一起坐下来,花1-2周的时间来检查我被黑的togethor代码。他会解释我哪里出错了,C和指针的更好之处(男孩确实使我感到困惑!)。我们在大约一周的时间内编写了一个不错的类/模块。我只能说,如果高级开发人员没有花时间在正确的道路上帮助我,我可能就不会持续很长时间。

    很高兴,下线了两年,我希望我的一些同事甚至可以将我视为普通的程序员。

    带回家积分

  • 大多数大学都不擅长为现实世界做好学生准备
  • 配对编程确实对我有所帮助。并不是说它会帮助所有人,但对我有用。

  • 坦白说,如果您需要付出很多努力才能让他做某事,那么您可能不得不接受这样的想法,即他可能不适合该团队,并且可能需要离开。现在,这并不一定意味着要解雇他……这可能意味着要在公司的其他地方找到他的技能更适合的人。但是,如果没有别的地方……您知道该怎么办。

    我假设他也是一个相当新的员工(<1年),并且可能刚从学校毕业……在这种情况下,他可能不习惯公司环境中的工作方式。像我们大多数人这样的事情在大学里就可以摆脱。

    如果是这种情况,我发现可以做的一件事就是进行"令人惊讶的新员工审查"。如果您以前从未做过,那也没关系...他不会知道的。只是坐下来,告诉他您将要检查他的表现,并向他显示一些真实的数字...拿起您的普通复习表(您确实有一个正式的复习程序吗?),并根据需要更改标题官员,并向他展示他的立场。如果您在一个非常正式的环境中向他展示不进行测试会对他的成绩产生不利影响,而不是仅仅" na"他,那他将有望得到这一点。您必须向他证明他的行为实际上会对他产生影响,无论是明智的选择还是其他目的。

    我知道,您可能不希望这样做,因为它不是官方的...但是我认为您有理由这样做,并且它可能比拥有它便宜很多。开除他并招募新人。


    将它们分配给不需要"高质量稳定代码"的项目,如果您担心的话,请让我们继续。开发人员失败。让他们成为"周末加入"来解决他们的错误的人。多吃午饭,谈论软件开发实践(不是讲座,而是讨论)。随着时间的推移,他们将获得并开发最佳实践来完成分配给他们的任务。

    谁知道,他们甚至可能提出比您的团队目前使用的技术更好的东西。


  • 使代码覆盖率成为评论的一部分。
  • 将"编写一个暴露该错误的测试"作为修复错误的先决条件。
  • 需要一定级别的覆盖范围,才能检入代码。
  • 找到一本关于测试驱动开发的好书,并用它来展示"测试优先"如何加速开发。

  • n


    很多心理学和有用的"指导"技术,但是,老实说,这归结为"如果明天想继续工作,写测试。"

    您可以用自己认为合适的任何条件(粗糙或柔软)使用它,这无关紧要。但是事实是,程序员不仅仅为了将代码拼凑起来而付费


    如果初级程序员或任何其他人在测试中看不到价值,那么很难让他们去做……。

    我本来会让初级程序员牺牲他们的周末来修复该错误。他的行动(或缺乏行动)不会直接影响他。另外,请明确指出,如果他不提高自己的测试技能,他将不会看到晋升和/或加薪。

    最后,即使在您的所有帮助,鼓励和指导下,他也可能不适合您的团队,所以让他去寻找可以得到帮助的人。


    教导他/她是他的导师的责任。您教他/她如何测试的程度如何。您正在和他配对编程吗?青少年(Junior)很可能不知道如何为xyz设置良好的测试。

    作为一名初中新生,他了解许多概念。一些技巧。一些经验。但最后,所有初级人员都是有潜力的。他们使用的几乎所有功能都将有从未有过的新功能。可以肯定的是,Junior可能在类上为一个项目完成了一个简单的State模式,即打开和关闭" doors",但从未在现实世界中使用过该模式。

    他/她只会和你的教学水平一样好。如果他们能够"做到这一点",您认为他们本来应该担任初级职位吗?

    以我的经验,少年被录用并承担与老年人几乎相同的责任,但是薪水较低,而当他们开始步履蹒跚时,他们就会被忽略。原谅我,如果我看起来很苦,那是因为我。


    我第二次对RodeoClown的评论是关于代码审查每个提交的。一旦完成了几次,他就会养成测试东西的习惯。

    我不知道您是否需要阻止这样的提交。
    在我的工作场所,每个人都可以自由提交所有内容,并且所有SVN提交消息(带有差异)都通过电子邮件发送给团队。

    注意:如果您打算这样做,您真的想要雷鸟彩色差异插件。

    我的老板或我自己(两个"高级"编码员)最终将阅读提交内容,并且如果有诸如"您忘记添加单元测试"之类的内容,我们只需轻拂电子邮件或去和那个人聊天,解释为什么他们需要单元测试或其他。鼓励其他所有人也阅读提交,因为这是查看正在发生的事情的一种好方法,但是初级开发人员对此没有太多评论。

    您可以通过定期说出类似这样的话来鼓励人们养成这种习惯:"嘿,鲍勃,您看到我今天早上所做的Promise了吗,我发现了这个整洁的窍门,您可以执行任何操作,请阅读提交并查看其工作原理!"

    注意:我们有2个"高级"开发人员和3个初级开发人员。这可能无法扩展,或者您可能需要与更多开发人员一起稍微调整该过程。


    如果您的同事缺乏编写测试的经验,则可能是他或她在简单情况下难以进行测试,这表明自己是测试不足。这是我会尝试的方法:

    • 花一些时间并与同事共享测试技术,例如依赖项注入,查找极端情况等。
    • 提供回答有关测试的问题。
    • 对测试进行代码审查一段时间。要求您的同事审查您所做的更改,这些更改是良好测试的典范。查看他们的评论,看看他们是否真的在阅读和理解您的测试代码。
    • 如果有特别适合您团队测试理念的书籍,请给他或她一个副本。如果您的代码审阅反馈或讨论参考了本书,这可能会有所帮助,以便他或她有一个可以跟进和关注的话题。

    我不会特别强调羞耻/内gui感。值得指出的是,测试是一种被广泛采用的良好实践,并且编写和维护良好的测试是出于职业上的礼貌,因此您的队友无需花上周末的时间,但我不会为那些要点而烦恼。

    如果您真的需要"变强硬",那就建立一个公正的制度;没有人喜欢觉得自己被人挑出来了。例如,您的团队可能需要代码来维持一定水平的测试覆盖率(可以玩游戏,但至少能够自动化);要求新代码进行测试;要求审阅者在进行代码审阅时考虑测试的质量;等等。建立该系统应该来自团队共识。如果您仔细地主持讨论,您可能会发现其他潜在原因导致您的同事的测试与您的预期不符。


    @ jsmorris

    我曾经让高级开发人员和"架构师"谴责我和一名测试员(这是我从大学毕业以来的第一份工作),因为他没有熬夜并在前一天晚上完成了这样的"轻松"任务。我们整天待在那儿,并称它在晚上7点退出。从那天中午11点开始,我就一直在痛苦地挣扎,并且缠着我们团队的每个成员至少两次寻求帮助。

    我回复并抄送了该团队:
    "我对您感到失望了一个月了。我从未从团队那里得到帮助。如果您需要我,我会在马路对面的咖啡店里。对不起,我不能调试几乎所有东西都依赖的12参数800行方法。"

    在咖啡店里冷却一个小时后,我回到办公室,抓住我的垃圾,离开了。几天后,他们打电话给我,问我是否要进来,我说可以,但是我接受了采访,也许是明天。

    "那么你辞职了吗?"


    在您的源存储库上:在每次提交之前使用钩子(例如,针对SVN的预提交钩子)

    在该挂钩中,检查每种方法是否至少存在一个用例。使用单元测试组织的约定,您可以通过预提交钩子轻松实施该约定。

    在集成服务器上,编译所有内容并使用测试覆盖率工具定期检查测试覆盖率。如果代码的测试覆盖率不是100%,则阻止开发人员进行任何提交。他应该向您发送涵盖100%代码的测试用例。

    只有自动检查才能在项目上很好地扩展。您无法手动检查所有内容。

    开发人员应具有检查其测试用例是否覆盖100%代码的方法。这样,如果他不提交100%经过测试的代码,那是他自己的错,而不是"糟糕,对不起,我忘记了"错。

    记住:人们永远不会做您期望的事情,他们总是会做您检查的事情。


    n


    这可能有点儿无情,但是您描述情况的方式听起来像是您需要解雇这个人。或者至少要说清楚一点:拒绝遵循房屋开发实践(包括编写测试)并检入其他人必须清理的错误代码最终会导致您被解雇。


    初级工程师/程序员无需花费大量时间来设计和执行测试脚本的主要原因是,因为大多数CS认证并没有太多要求,所以大学课程中进一步涵盖了其他工程领域,例如设计模式。

    以我的经验,使初级专业人员习惯的最好方法是明确地将其纳入流程。也就是说,在估算迭代所需的时间时,应将设计,编写和/或执行案例的时间纳入此时间估算中。

    最后,审查测试脚本设计应作为设计审查的一部分,而实际代码应在代码审查中进行审查。这使程序员有责任对他/她编写的每一行代码进行正确的测试,而高级工程师和同伴则有责任对所编写的代码和测试提供反馈和指导。


    根据您的评论,"表明设计变得更简单",我假设你们正在练习TDD。在事实结束后进行代码审查将不起作用。关于TDD的全部事情是它是一种设计而不是测试理念。如果他没有将测试作为设计的一部分进行编写,那么事后编写测试将不会从中获得很多收益-尤其是从初级开发人员那里。他最终将丢失大量的极端情况,并且他的代码仍然很糟糕。

    您最好的选择是让一个非常有耐心的高级开发人员坐在他旁边,并进行一些配对编程。一直坚持下去,直到他学到为止。还是没有学到,在这种情况下,您需要将他重新分配给他更适合的任务,因为这只会使您真正的开发人员受挫。

    并非每个人都有相同水平的才能和/或动力。开发团队,甚至是敏捷团队,都由" A团队"上的人员和" B团队"上的人员组成。 A-Team成员是设计解决方案的架构,编写所有重要的生产代码并与企业主进行交流的人,而所有这些工作都需要在框外进行思考。 B团队负责处理诸如配置管理,编写脚本,修复me脚的错误以及进行维护工作-所有这些工作都有严格的过程,对失败造成的影响很小。


    推荐阅读