Testes Unitários:软件基础和资格!

2025-06-10

Testes Unitários:软件基础和资格!

照片由Ferenc AlmasiUnsplash上拍摄

苏马里奥

介绍

E ae dev,你和你在一起吗?

Hoje eu vim trazer um tema que eu gosto beeem pouco (sou apaixonado) que é sobre Testes Unitários e Qualidade de Software!

O post dessa vez está mais teórico que o 正常的 por aqui,mas fica comigo,pega um 咖啡馆和 garanta sua leitura!

Bora 专业帖子?

软件质量

睾丸的前兆、前兆定义了软件的资格。从产品和业务的角度来看,“客户”是软件的质量和功能要求,最终的期望和必要条件。是否等同于从一个角度去看待事物或从事物的角度来看待事物?

1977 年,James A. McCall 提出了定义软件划分质量标准的模型,并提出了 3 个不同的观点,如下:

  • 操作:与产品相关的特性。
  • 修订:产品修改和改进的能力。
  • 转换:重新适应环境。

基本条件:

操作

  • 相关性:该软件满足特定客户的具体要求和目标。
  • 机密性:我们可以通过程序执行特定功能。
  • 效率:通过程序执行功能的大量计算,可以实现 100% 安全和性能的操作。
  • 集成:质量控制、控制或访问软件和访问权限、操作权限或访问权限,无需访问权限或代码。
  • 用途:提供软件使用的便利。

修订:

  • 管理:执行本地化操作并修复程序中的错误。
  • 灵活性:无需软件即可分析或利用,可以轻松地使用软件来实现更改。
  • 测试能力:对软件功能进行分析和测试,不通过自动化进行。

翻译:

  • 便携性:为在平台外或环境中移动的产品提供便利。
  • 重用:作为软件的媒介,您可以重新使用软件、重新使用软件、重新开发软件。
  • 互操作性:软件的能力。

同样,从开发角度看,软件资格也可以保证软件符合开发流程规范和定义的资格。测试并保证软件的资格。 Ainda assim,vamos 响应者,接下来。

Por que eu devo testar meu codigo?

Você em algum momento da sua carreira deve ter se perguntado:“ será que se eu alterar isso aqui, isso ainda vai Continue funcionando? 🤔”。我觉得这会导致功能重构变得不稳定吗? Seu código/projeto não trazia nenhumaconfiança quando estava tomando proporções maiores?

Pois é... e como saber se aquilo que você Implementou funciona em conjunto com aquilo já foi Implementado?军刀算法功能的完美操作:testando

Ao testar o seu projeto, você garante mais:

  • 保密性;
  • Integridade、evolução 和 melhorias no codigo;
  • Velocidade nas entregas edemandas(uma vez que um código Existente já possui testes, a preocupação nas mudanças e Implementações futuras é menor, podendo-se ter mais agilidade e previsão aodecrer do desenvolvimento);在任何节奏中,睾丸的执行者都必须对立。这是渐进的,在软件中,我们可以考虑到更多的睾丸,更多的需求,以及更多的资格。
  • 无软件资格(fácil manutenção、flexível a alterações、testabilidade e 等、tudo que falamos na introdução);
  • 减少遇到的错误;
  • 实施主要目标和主要目标。

Agora que você já sabe os motivos pelos quais você deve Implementar testes, vamos conhecer alguns dos titos de testes !

睾丸类型

睾丸金字塔

字体:https ://martinfowler.com/articles/practical-test-pyramid.html

迈克·科恩 (Mike Cohn) 在 2009 年出版的《敏捷的成功》中描述了这一点。没有提及“测试自动化金字塔” (pirâmide de automação de testes) 和流行的“测试金字塔” (pirâmide de testes)。

具有 3 项功能:

  1. 睾丸
  2. 服务测试
  3. 乌苏亚里奥接口测试

Pode-se 观察 que,à medida em que chegamos ao topo da pirâmide,menor é quantidade de testes que teremos e mais "caros" eles serão (pensando em processamento)。快速执行睾丸手术。

💡 Recebi uma 非常推荐Paulo Gonçalves,他是敏捷测试人员的替代品和补充睾丸的材料。Samanta Cicilia“Abordagem de testes”和演讲“AT Talks:Triângulos de Teste,Não Mais”。链接可能会出现在参考链接和链接中。

睾丸

在金字塔的基础上,测试单元是一个基础单元,它是独立软件的主要测试单元。 “Tá, mas qual é a menor unidade do software?”:podem ser métodos/funções、classes、módulos 等。 Esses testes validam o comportamento esperado de um método/função:dada uma minated execução espera-se uma saída。

就像软件的功能一样,测试的方式也多种多样,执行的方式决定了条件,结果是不同的测试。 O teste unitário nos possibilita criar um código mais objetivo, com métodos limpos e com uma única e determinada funcionalidade (daí, associa-se também o conceito de "unidade"), sendo possível ser testado de maneira isolada.

Vamos 是 JavaScript 测试单元的范例!想象一下,计算的过程和集中化的操作都是在 um arquivo 进行的。预测试或与功能相关的演奏。没有例子,espera-se que a função sumretorne a soma de ae b。 Como seria o nosso teste?



// calculator.js
const sum = (a, b) => a + b;

export { sum };

// calculator.spec.js
import { sum } from './calculator.js';

describe('calculator.js', () => {
  it('should return the sum of a and b', () => {
    const a = 1;
    const b = 2;

    const result = sum(a, b);

    expect(result).to.equal(3);
  });
});


Enter fullscreen mode Exit fullscreen mode

关于测试的描述,请参阅特定功能的测试场景。

Você ter a seguinte reflexão quando for escrever os seus testes unitários:“essa função/método deve fazer isso quando aquilo ”。你必须确定,是必要的条件

Dicas para escrever bons testes unitários

  • Escolha as melhores asserções para cada momento.
  • Evite ruídos e dependentências entre os testes, garanta o isolamento。您的测试依赖于外部的 quaisquer fatores ele não é mais um teste unitário
  • 使用测试单元来定义设计方案。在睾丸书写过程中,我们必须确定是否需要恢复正常状态(e também isolá-lo)。祝您生日快乐。
  • 因此,最重要的是:避免“estressar”camadas que excedam a barreira de unidade:banco de bados、第 3 方 API...Os testes unitários semper superarão os testes das camadas Superiores da pirâmide。要快速执行睾丸单位,请使用测试双打

那么,你想参加测试双打吗?

什么是测试双打

马丁·福勒第二,“测试双打”是测试双打的通用术语。 Pense em “dublê”,aqueles de movie mesmo, que “simulam” a parência eo comportamento dos atores em um filme. Você provavelmente deve conhecer or conceito de maneira genericizada como "mockar" or pela palavra "Mock". O fato é que Mock é apenas um dos Tipos de “dublês” que temos disponíveis.

Além dele temos Dummies、Fakes、Spies 和 Stubs。

假人、赝品、间谍、存根和模拟

假人:圣物或虚构的东西代替了现实中不使用的睾丸。 São usados para satisfazer parametros。如果您想了解睾丸复合体的可能性,那么这并不重要。

假货:São objetos reais que Implementam um comportamento que os Torna inviável para serem utilizados em produção(例如内存数据库)。

间谍:作为注册员的“espiões”信息,可确定功能。重要的具体方法是使用特定的方法来进行重要的功能,并发送测试数据以进行查马多、量子、论据等。

存根:são semelhantes aos spies porém,ele consegue substituir toda a Implementação de um 特定方法,mudando o seu comportamento。 São úteis para simular uma possível exceção, evitar estresse na camada de serviço: persistência de bados (evitando de gravar um registro no banco de bados, por exemplo);可以使用 API 或集成来提供可能的服务,但测试的执行速度会变慢。

模拟: 类似的存根 Porém、一个 camada mais alta para Tornar um comportamento falso、geralmente、são usados para emular um banco de bados、um output de bados ou até mesmo uma dependentência、a diffença é que、com um stub、é possível testar diversas seu código的分支,já com或mock,é possível testar diversos comportamentos de uma só vez。 Os Mocks tem Expectativas sobre o jeito que ele deve ser chamado e, caso não seja chamado da forma correta, o teste deve falhar.

模拟和存根之间的差异

模拟和存根之间的差异与我们想象中的不同,我们使用的软件中没有任何软件,电子邮件和电子邮件是关于博阿斯-文达斯的信息,并且是关于我们的参考资料。没有任何关于睾丸的情况,无法通过电子邮件进行。 Podemos usar 嘲笑了 ou 存根,mas afinal...有区别吗?

观察 Martin Fowler 的“ Mocks Aren't Stubs”实现(sim,em Java mesmo haha​​ha)。 Criamos um stub que Implementa o método sendapenas com um contador (adicionando a mensagem para ser enviada na lista messages), ou seja, deixaremos de envirar o e-mail propriamente:



public interface MailService {
    public void send(Message msg);
}

public class MailServiceStub implements MailService {
    private List<Message> messages = new ArrayList<Message>();

    public void send(Message msg) {
        messages.add(msg);
    }

    public int numberSent() {
        return messages.size();
    }
}


Enter fullscreen mode Exit fullscreen mode

com nosso 存根,可以用来验证没有测试的状态:



class OrderStateTester {

 public void testOrderSendsMailIfUnfilled() {
    Order order = new Order(TALISKER, 51);
    MailServiceStub mailer = new MailServiceStub();

    order.setMailer(mailer);
    order.fill(warehouse);

    assertEquals(1, mailer.numberSent());
  }
}


Enter fullscreen mode Exit fullscreen mode

验证该存根的断言和使用方法的正确性numberSent

Usando 嘲笑,nosso teste ficará um pouco different:



class OrderInteractionTester {
    // ...
    public void testOrderSendsMailIfUnfilled() {
        Order order = new Order(TALISKER, 51);

        Mock warehouse = mock(Warehouse.class);
        Mock mailer = mock(MailService.class);

        order.setMailer((MailService) mailer.proxy());

        mailer.expects(once()).method("send");
        warehouse.expects(once()).method("hasInventory")
            .withAnyArguments()
            .will(returnValue(false));

        order.fill((Warehouse) warehouse.proxy());
    }
}


Enter fullscreen mode Exit fullscreen mode

Lembra que falamos que os mocks tem Expectativas sobre or jeito que ele deve ser chamado? Aqui criamos as Expectativas (espera-se que o método mailer.senddeve ser chamado ao menos 1 vez eo método warehouse.hasInventoryseja chamado ao menos uma vez, com qualquer argumento e retornará falsequando chamado. Se por ventura alguma dessas Expectativas não forem atendidas, nosso teste falhará.

Em ambos os casos usamos Test Doubles ao invés do nosso serviço de e-mail (evitando o estresse externo)。一个主要的区别是,com 存根使用了真实验证和模拟用户验证

TDD:测试驱动开发

在此,我们介绍了睾丸单元的通用方法,以及构建睾丸单元的方法: o TDD!

TDD 是“测试驱动开发”,葡萄牙语“Desenvolvimento Orientado à Testes。A técnica foi criada/descoberta em 2003 pelo engenheiro de americano americano Kent Beck (um dos dos do eXtreme Programming ou simplesmente, XP) e declara que o TDD é um método que encoraja 设计以简单的方式和启发灵感。

我们采取的方法是采取一系列措施或采取一些措施来实施,以取得积极的结果。混乱不?

冷静下来,我解释清楚了!

TDD 周期

字体:https://www.rcelebrone.com/2021/03/podcast-teste-unitario-automatizado-tdd.html

Como mencionei,一个 TDD 的想法,是一种可以通过各种方式进行工作的想法。 Iniciando a partir da escrita de um teste para sua solução. O TDD 和 3 个循环的组合,按顺序应用:

  • 红色:escreva um teste que irá falhar。伊索梅斯莫! Pense em como você teria um teste caso o seu código estiveesse Implementado。
  • 绿色:部分迪索,实施满足条件的测试条件。直观地讲,这是一个实施过程,也是一个测试过程,而不是前面的过程。
  • 重构:前面的内容,在测试过程中很容易出现问题,然后将其放在最重要的位置:合法性,重复性,重复性。 Deixando-o 功能,e mais limpo。结果(e é comum),o seu teste criado no primeiro ciclo, pode vir a falhar com a refatoração。没有任何进展,我们将无法通过测试。

反复对睾丸进行迭代,以实现满意的具体解决方案。

TDD 与 Escrever o teste depois

Ressaltando que o TDD éuma metodologia para desenvolvimento e escrita de código, você deve estar se perguntando:“Po, mas o que eu ganho escrevendo o teste antes? Será que vale a pena?”

如果我对软件进行了一些测试,那么它会在 TDD 实践中对测试产品进行量化,这与方法论之外的方法不同,因此您可以在实践中使用 colocando-a 进行实际操作,这与实际应用中的实际情况无关。

使用 TDD 的原则有利于睾丸的肌腱反馈,并且可以量化反馈!

Pense comigo:在 um sistema“legado”(onde a quantidade de código é muito maior para ser testado)中实现更好的测试,或者在 código ainda é pequena 的基础上应用 TDD 没有启动项目? Quanto maior é a quantidade de código escrito,maior será o custo da mudança。 Ao aplicar o TDD,o desenvolvedor recebe o Feedback em um momento onde as mudanças ainda são baratas!

软件资质分析

Falamos muito sobre testes 和 qualidade de software,mas mais do que garantir,como podemos mensurar como anda a qualidade do nosso código-fonte?

存在一些辅助因素,可用于生产和生产。 É comum as empresas adotarem táticas para evitar que um projeto com pouca qualidade (isso envolve segurança e todos os outros quesitos mencionados na introdução desse artigo) sejaimplantado noambiente produtivo.最后,请务必做好补救工作。

使用 SonarQube 的商品非常出色!

SonarQube

SonarQube 可以自动修改代码以检测错误、漏洞、测试过程中的错误以及代码的气味。集成CI/CD允许在分支进行项目和拉取请求时继续检查代码

项目分析的变化和后续的基础:

  • O desenvolvedor abre um Pull Request com o código novo criado e testado。
  • CI/CD 的工作流程是 CI 和 PR 部分的管道
  • 一个 CI 执行项目的管道,用于实现测试和额外的代码执行。
  • 一个 CI 环境的管道,与 SonarQube 的元数据一起集成。
  • SonarQube 接收元数据和控制面板com um 概述完整的 sobre 或 seu 项目。

SonarQube 仪表板

存在多种外设和服务(例如工作服Codecov),您可以随时使用它。

最后...

Bem,é isso,por hoje,é so!

我的问题是,我的意见、评论、批评、纠正或建议都对公众提出了。

Deixe seu ❤️ se gostou ou um 🦄 se esse post te ajudou de alguma maneira!前面的帖子是这样的,我的内容是连续的。

吃!

参考文献和链接

鏂囩珷鏉ユ簮锛�https://dev.to/wnqueiroz/testes-unitarios-fundamentos-e-qualidade-de-software-5af0
PREV
24个前端性能优化技巧
NEXT
如何使用 Google Gemini API 免费创建具有自定义数据和自定义聊天机器人