Testes Unitários:软件基础和资格!
苏马里奥
介绍
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 项功能:
- 睾丸
- 服务测试
- 乌苏亚里奥接口测试
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 sum
retorne a soma de a
e 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);
});
});
关于测试的描述,请参阅特定功能的测试场景。
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 hahaha)。 Criamos um stub que Implementa o método send
apenas 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();
}
}
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());
}
}
验证该存根的断言和使用方法的正确性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());
}
}
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.send
deve ser chamado ao menos 1 vez eo método warehouse.hasInventory
seja chamado ao menos uma vez, com qualquer argumento e retornará false
quando 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 设计以简单的方式和启发灵感。
我们采取的方法是采取一系列措施或采取一些措施来实施,以取得积极的结果。混乱不?
冷静下来,我解释清楚了!
字体: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 项目。
存在多种外设和服务(例如工作服和Codecov),您可以随时使用它。
最后...
Bem,é isso,por hoje,é so!
我的问题是,我的意见、评论、批评、纠正或建议都对公众提出了。
Deixe seu ❤️ se gostou ou um 🦄 se esse post te ajudou de alguma maneira!前面的帖子是这样的,我的内容是连续的。
吃!
参考文献和链接
- 模拟并非存根
- 测试驱动开发:TDD Simples e Prático
- 最后,什么是 TDD?
- 肯特·贝克 - 维基百科
- 极限编程 - 维基百科
- SonarQube 文档
- 代码异味
- 什么是 CI/CD?
- 睾丸切除术
- AT 会谈:Triângulos de Teste、Não Mais