测试不适合初学者

我是测试的忠实粉丝。 我在博客和邮件列表中写过它,在业余时间与其他开发人员讨论了这个问题,甚至还开发了关于Go测试的培训课程。

但是,尽管我非常喜欢测试,但我不建议初学者使用它。

听起来很疯狂吧? 在本文中,我将更详细地阐明我的观点,但最终,整个观点归结为两点:

  1. 初学者没有足够的知识来编写除最简单的测试以外的任何内容。 这不可避免地导致了下一点...
  2. 在学习编程的同时,试图训练编写实际测试所必需的技能非常困难

我了解,从原则上讲,这是一点。 无论如何,我将其分为两部分,以使其更易于理解。

我知道你们中的许多人会不同意我的观点,但是请阅读这篇文章,如果在阅读后仍然不满意,我很乐意与您讨论。 最后我来这里学习

初学者缺乏写最简单测试以外的知识的能力


每当新手编写代码时,其主要目的就是不分解任务,避免全局变量或编写测试代码。 老实说,大多数初学者可能都不知道这是什么。 实际上,他们的主要目标很简单-使该死的东西起作用。 仅此而已。

确认这一点不太可能需要任何努力,只需查看新手编写的代码即可。

转到网络应用程序? 当然,他们在代码中的任何地方都可以编写SQL查询,并且几乎可以保证与数据库的连接存储在全局变量中。

Rails应用程序? 当然,您会在视图中看到业务逻辑,并且控制器中会出现大量的逻辑阻塞。

PHP Web应用程序? 如果所有逻辑都在一个php文件中(表单解析,与数据库的交互等),我不会感到惊讶。

即使我们采用基本功能(例如功能有限的计算器),我们仍然会遇到我所描述的示例。 这完全不是因为初学者没有该死,他们只是还不知道如何做得更好而已。

初学者不知道什么是依赖注入,他们不了解全局变量如何使测试复杂化,很可能他们不知道模拟是什么,因此期望他们理解如何设计易于编码的代码是非常荒谬的。

因此,对于初学者来说,只有最简单的测试才有意义:

func Add(a, b int) int { return a+b } // And a test... func TestAdd(t *testing.T) { got := Add(2, 4) want := 6 if got != want { t.Errorf("Add() = %d; want %d", got, want) } } 

尽管我没有问题可以向初学者展示并告诉他们什么是测试,但我认为向他们展示此代码并假装它就像是真正的测试是非常荒谬的。

最后,这导致我们开始更多地教他们。 我们试图解释什么是依赖注入,为什么全局变量会使测试复杂化,例如time.Now()会使检查边界情况变得困难。 在这个地方,我开始担心,因为我们不再教导初学者如何编写代码。 此刻,我们教他如何编写代码以及如何进行测试 。 这将我带到第二点...

在学习编程的同时,试图训练编写实际测试所必需的技能非常困难


和以前一样,我希望您考虑一下新手编写的代码,但是这次我希望您记住一些您编写的第一个程序。

如果您像我一样,您的第一个Web应用程序可能看起来像这样:

 <p> <?php // This may not work. I don't know PHP anymore. $name = $_GET['name']; echo "Hello, " . $name; ?> </p> 

艺术品,对不对?

现在,假设您是第一次编写此代码,并且有人告诉您应该对其进行测试。 而且您必须使用React。 和框架。 哦,对数据库进行调整也可以对GraphQL进行调整,这不会对您造成伤害。

我不知道为什么,但是我们的开发人员习惯于使用从多年的经验和实践中获得的技能,并期望其他人(尤其是初学者)也能做到这一点 。 这太荒谬了! 有人会期望他会理解数学,这是因为您自己已经学习了三角学,代数等,并且您可以使用数学来解决特定的问题。

如果某些东西适合您,并不意味着它适合初学者。 它们可能没有上下文,而没有必要的经验和实践来受益于您的使用。 或者,他们正在努力解决的问题实际上太简单了,无法使用所有这些复杂的解决方案。

好像我们忘记了如何逐步研究HTTP请求的工作方式一样。 标头如何工作。 饼干 表格。 到服务器的POST请求如何工作-甚至还有极端不同的HTTP方法。 而且,我们通过良好的旧试错法学习了所有这些内容。

实际上,我不认为应该归咎于测试,真正的问题是我们坚信,您应该同时学习编程,测试,网站建设和数百万其他内容。 我真的不知道这是怎么发生的,但是,我怀疑,部分原因是我们不必费心去考虑研究所有这一切的成本。 初学者问“我应该学什么?” 然后我们开始“学习测试,做出反应,使用graphql并继续使用,但仅使用标准库...”

不,不,再不。 停下来



这是荒谬的,因为在其他情况下,这种方法的荒谬性显而易见。 如果您想教别人踢足球,请从打包和运球等基础知识开始。 您不会先说“这就是专业人员的工作方式”,然后打开Ronaldo的视频然后离开。 那么,我们到底要和新手一起做什么呢?

我们试图通过说:“好吧,他们当然知道不可能同时学习所有这一切”来为自己辩护,但他们不理解! 新手开发人员陷入这种陷阱,由于被卡住而感觉像废话,这使情况更加恶化。 在他们看来,他们根本没有成为开发人员所需要的东西,这对您我来说都是可耻的,因为如果他们不闯入这堵砖墙,他们中的许多人就会喜欢编程。

这使我想到了我真正想说的-如果我们集中精力同时研究几件事情,我们中的许多人就会学习得更好。 我们想要新的挑战,我们想尝试新的事物,但我们不想感到困惑并陷入昏迷。 了解测试和其他内容(例如,如何创建Web应用程序,http,cookie等的工作方式)是陷入此陷阱的一种简便方法。 因此,我通常建议您先学习其余部分,然后再进行测试。 在研究测试时,您始终可以返回到旧项目,看看现在将如何重建它们,但这只有在您不过载,不烦恼并且最终没有放弃这项业务的情况下才有可能。

但是,如果我想学习如何测试呢? (还有一百万其他“如果”)


冷静前进! 当然,您可以先学习测试,然后再学习Web开发或其他主题。 我敢肯定有些人这样做了,您可能会更喜欢这种方式。 当我说测试不适合初学者时,我并不是说这不是学习的坏话题,我的意思是,尝试学习测试以及其他任何东西都是错误的。

大多数人都想学习如何首先创建Web应用程序或视觉对象,但这并不意味着您需要从此开始,您可以很好地从测试开始。 碰到障碍之前,您可能可能不会开始了解任何东西,但不要让我阻止您学习想要的东西。

这也不意味着您不能在结对编程等过程中学习。 有了导师,您可以同时学到许多东西,并成功地承受了这种负担,因为您将有人指导您完成所有这一切。 在这种情况下,如果迷路了,您将不会陷入僵局,也不会感到失败,因为会有人说“您做得很好,现在太难了。 下次尝试X和Y代替!” 简而言之,在这种情况下,您不会感到困惑,失望和退出。

Source: https://habr.com/ru/post/zh-CN451118/


All Articles