在抽象中增强测试清晰度和诊断
#javascript #教程 #生产率 #测试

在Woovi,我们坚信将高测试标准作为我们发展方法的重要组成部分。我们确保包括测试以及我们的功能,并通过使用不同的简化,确保我们可以快速安全地将这些测试放在一起。

对于我们的前端和后端系统,我们主要使用开玩笑作为主要的测试工具。这种灵活的工具有助于我们彻底检查软件零件的工作方式。此外,我们为每个环境创建了特定的功能,使我们的测试过程更加顺畅。

错误堆栈跟踪的重要性

错误堆栈跟踪是诊断我们开发工作中问题的关键工具。它为我们提供了有关为什么失败发生的宝贵信息,并帮助我们找到解决方案的方法。例如:

it("should sum two numbers", async () => {
  expect(1 + 2).toBe(4);
});

在这个基本示例中,我们故意犯了一个错误。出现的错误消息不仅表明出现问题了,而且还将准确显示错误发生在哪里。这使得更容易找出问题。

sum-test

引入抽象

要演示抽象在测试中的实用性,请考虑以下代码段:

const assertSum = (numbers: number[], result: number) => {
  const [x, y] = numbers;
  expect(x + y).toBe(result);
};

it("should sum two numbers", async () => {
  assertSum([1, 2], 4);
});

在这种情况下,我们将测试步骤放入assertSum函数中,这使重复使用代码变得更加容易。如果出现问题,它给出的错误消息将是这样:

sum-test-2

乍一看,它看起来像是一条有用的消息,很容易找到哪个测试破裂,因为我们只有一个。

导航复杂性

在实际情况下,我们的代码库包括多个测试和许多操作。例如:

const assertSum = (numbers: number[], result: number) => {
  const [x, y] = numbers;
  expect(x + y).toBe(result);
};

it("should sum two numbers", async () => {
  assertSum([1, 2], 3);
  assertSum([1, 6], 7);
  assertSum([9, 2], 4);
  assertSum([4, 6], 12);
});

it("should sum two numbers with two decimal places", async () => {
  assertSum([12, 21], 89);
  assertSum([16, 65], 80);
  assertSum([91, 20], 111);
  assertSum([40, 62], 102);
});

sum-test-3

在这些复杂的情况下,这条消息难道不是告诉我们它破裂的位置,assertSum破裂了吗?在哪一行?在更接近现实的情况下,您在几个测试中使用抽象,而失败只会使情况变得更糟,您不确定哪一行失败了,哪些操作失败了。

增强错误诊断

为了使我们的抽象在诊断问题上更​​好,我们使用一个try-catch块:

const assertSum = (numbers: number[], result: number) => {
  const [x, y] = numbers;

  try {
    expect(x + y).toBe(result);
  } catch (error) {
    Error.captureStackTrace(error as Error, assertSum);
    throw error;
  }
};

这是输出:

sum-test-4

此改进使错误堆栈跟踪更详细,从而完整地了解了错误发生的位置,预期和实际发生的事情。这导致了彻底的诊断输出,可以帮助开发人员快速解决该问题。

为什么要抽象expect

在您始终检查相同数据的情况下,您可以对期望进行抽象。

一个更现实的例子是您模拟突变操作并确保执行下一个操作的名称是您期望的名称。

export const assertOperation = <T extends OperationType>(
  environment: RelayMockEnvironment,
  name: string,
) => {
  const queryOperation = environment.mock.getMostRecentOperation();

  const operationName = queryOperation.root.node.name;

  try {
    expect(operationName).toBe(name);
  } catch (error) {
    Error.captureStackTrace(error as Error, assertOperation);

    throw error;
  }
};

总结

在Woovi,我们的测试方法集中在彻底,使用抽象和精确的诊断问题上。在开玩笑和精心设计的摘要的帮​​助下,我们使我们的开发团队能够创建强大而顶尖的软件,不仅可以满足,而且始终超越了
期望。


Woovi是一家创业公司,使购物者能够按照自己的意愿付款。为了实现这一目标,Woovi为商人提供即时付款解决方案接受订单。


UnsplashUnsplash