在 TDD 中,测试是否需要自动化?

软件测试 tdd 遗留系统
2022-02-05 15:24:00

我公司的经理的经理(......和他的经理,以及其他所有穿西装的人)正在谈论我们真正需要如何过渡到 TDD,因为它比我们现在所做的更好。不幸的是,我们正在处理一个非常古老的系统,它的自动化测试为零。这在很大程度上源于没有分配时间来围绕它建立任何类型的框架,并且担心这样的框架需要大量时间来维护并且它的唯一输出会增加开发人员的工作量。(你和我都认为这是一件好事。你可能还记得我围绕它提出的其他几个问题。)

我们最近聘请了一位“发布经理”,他基本上只是建立了一个项目管理系统并查看所有进入的项目并确保他们拥有所有文档。显然,SOX 合规性要求有一个,即使他的头衔和他的职位描述看起来并不匹配。他现在寻找的东西之一(如果提案缺失则拒绝该提案)是一份测试文档:分析师提出的关于如何测试他们支持的新功能或错误修复的一系列步骤。我不会讨论文档的质量,但至少它们中的大多数不仅仅是“部署到测试环境,分析员进行测试”。让我们假设它们中的足够多的质量足够好,至少可以为某人提供快乐的路径测试。

这被认为是 TDD 吗?我想我一直认为 TDD 意味着您必须在上课之前编写单元测试,或者在编写两个模块之间的桥接代码之前编写集成测试。

现在,我不想陷入“我们是敏捷的!” 陷阱。我认为坐在会议上争论我们是否真的在做 TDD 是愚蠢的。但我认为重要的是能够将我们正在做的事情与其他人学到的经验结合起来。如果我们正在做(一般社区所说的)TDD,那么我们很可能会从针对做 TDD 的团队的建议中受益。

所以我的问题是:

  • TDD 要求的测试是否需要自动化?
  • 我们是否在做一般社区所说的 TDD?
  • 如果我们不是,我们需要改变什么?
  • 不管我们是否“是”,这里是否有一些危险信号可以让我们更符合 TDD 社区?

编辑:

到目前为止,似乎是的,您确实需要自动化测试才能成为“TDD”。因此,后续问题可能是有多少 TDD 将转化为“仅手动测试”环境?

4个回答

TDD 一般是开发人员首先编写单元测试设计的代码。开发人员和 QA 人员处理测试概念的方式存在根本差异。将单元测试视为代码合同更有帮助。这些将随着时间的推移而更新和更改,这是主要区别。对于 QA 人员来说,测试一旦起作用,就应该始终起作用,除非该功能已被明确删除。对于开发人员来说,只要修改了它们所涵盖的代码,就会更新/修改单元测试。这并不意味着单元测试毫无用处。它们非常适合测试业务规则,也非常适合告知开发人员给定方法做什么或应该做什么。单元测试通常会在发现涉及不同区域之间交互的错误时分解。测试文档通常是测试方法的大纲和要涵盖的领域。然后创建一个包含测试步骤的测试计划。单元测试应该与每个构建一起运行,以便它们服务于任何实际目的。成功运行后,应对测试计划进行自动化审查。通常,您最初假设需要测试的东西并不是随着时间的推移而需要的。我认为诀窍是为给定的功能制定一个好的测试计划,然后在功能完成后配对完成测试用例,将该功能的“核心”测试用例添加到回归中。

真正意义上的 TDD 与 Aruna 所描述的完全一样。开发人员编写自动化单元测试,观察测试失败,然后继续编写单元测试要测试的代码,编写代码直到它通过,然后重构,同时维护核心单元测试。

理想情况下(至少在我的世界里),所有的测试也应该在一个测试运行器中组织成套件,比如 JUnit(没有使用 Java 的经验,但是,我似乎记得你说过你在公司使用过 Java)。这样,您还可以随时查看您的更改是否会在您测试过的任何先前代码中产生错误,然后再将其交给测试。

我看不到真正的危险信号(也与流感和发烧作斗争,所以我可能是错的),但是,如果您要查看 JUnit 或任何其他 xUnit,您认为您可以编写快速测试来进行测试吗?你的每一种方法?你真的认为这需要更长的时间吗?对于单元测试和一般的 TDD,通常不需要大量的框架。如果您每天只需要多花半小时到一个小时来编写测试,并且您自己的输出最终会更加可靠并且符合客户的规格,那么您的经理会介意吗?

根据您的编辑进行编辑: 在我自己的想法中,虽然可能不一定在其他人的想法中,但 TDD 是自动化的。在编写代码后手动测试代码只是一个好习惯。但是,如果您确实想采用 TDD 的动作并将它们应用到手册中,您可能会立即看到代码的一些改进。

  1. 准确写下您希望代码执行的操作
  2. 编写代码
  3. 断言代码完全按预期运行。

积极的一面是,您能够将这些测试提供给变革拥护者。

不利的一面是,如果您想确保它在未来仍能按预期工作,则必须手动进行。

我一直从事测试驱动开发,这就是我们接近它的方式。开发人员甚至在开始编码之前就开发了自动化单元测试。假设有 18 个测试来验证付款方式。在他编写代码之前,所有 18 个测试都会失败。编码完成后,他将确保所有 18 个自动化单元测试都通过。完成单元测试后,他会将测试移交给 QA。

我们在公司进行了自动化单元测试。我不确定是否必须将其自动化。

TDD 都不是手动测试。“驱动”部分的整个想法是,每次更改源代码时都会运行一组测试,以保持稳定性并防止出现回归问题。

然而,测试并不需要是单元测试。如果您愿意,它们可以是例如自动化 UI 测试。