diff --git a/1-js/03-code-quality/05-testing-mocha/3-pow-test-wrong/solution.md b/1-js/03-code-quality/05-testing-mocha/3-pow-test-wrong/solution.md index 6f0dec964..2ee207fc3 100644 --- a/1-js/03-code-quality/05-testing-mocha/3-pow-test-wrong/solution.md +++ b/1-js/03-code-quality/05-testing-mocha/3-pow-test-wrong/solution.md @@ -1,10 +1,10 @@ O teste demonstra uma das tentações que um desenvolvedor encontra ao escrever testes. -O que temos aqui são na verdade 3 testes, mas colocados numa única função com 3 *asserts*. +O que aqui temos são na verdade 3 testes, mas colocados numa única função com 3 *asserts*. -Por vezes, é mais fácil escrever desta forma mas, se ocorrer um erro, é menos óbvio ver o que há de errado. +Por vezes, é mais fácil escrever dessa forma mas, se ocorrer um erro, é menos óbvio ver o que está errado. -Se houver um erro dentro de um fluxo de execução complexo, então teremos que procurar entender os dados nessa altura. Teremos, na verdade, que *debug o teste*. +Se houver um erro dentro de um fluxo de execução complexo, então teremos que procurar entender os dados nessa altura. Teremos, na verdade, que fazer o *debug do teste*. Seria muito melhor repartir o teste em múltiplos blocos `it`, com claramente escritas entradas e saídas. @@ -25,9 +25,9 @@ describe("Eleva x à potência n", function() { }); ``` -Nós substituimos o único `it` por `describe` e um grupo de blocos `it`. Agora, se algo falhasse, veríamos claramente que dados estariam errados. +Nós substituímos o único `it` por `describe` e um grupo de blocos `it`. Agora, se algo falhar, vemos claramente que dados estão errados. -Também, podemos isolar um único teste e executá-lo num modo à parte (*standalone*) escrevendo `it.only` em vez de `it`: +Também, podemos isolar um único teste e executá-lo à parte (*standalone*) escrevendo `it.only` em vez de `it`: ```js diff --git a/1-js/03-code-quality/05-testing-mocha/3-pow-test-wrong/task.md b/1-js/03-code-quality/05-testing-mocha/3-pow-test-wrong/task.md index 579669730..2395e4862 100644 --- a/1-js/03-code-quality/05-testing-mocha/3-pow-test-wrong/task.md +++ b/1-js/03-code-quality/05-testing-mocha/3-pow-test-wrong/task.md @@ -1,4 +1,4 @@ -importância: 5 +importance: 5 --- @@ -21,4 +21,4 @@ it("Eleva x à potência n", function() { }); ``` -P.S. Sintáticamente, o teste está correto e passa. +P.S. Sintaticamente, o teste está correto e passa. diff --git a/1-js/03-code-quality/05-testing-mocha/article.md b/1-js/03-code-quality/05-testing-mocha/article.md index e5a3ab6b4..850df1a00 100644 --- a/1-js/03-code-quality/05-testing-mocha/article.md +++ b/1-js/03-code-quality/05-testing-mocha/article.md @@ -4,7 +4,7 @@ Teste automatizado será utilizado nos exercícios seguintes, e também é ampla ## Porque precisamos de testes? -Quando escrevemos uma função, nós geralmente podemos imaginar o que ela deveria fazer: que parâmetros dariam que resultados. +Quando escrevemos uma função, podemos geralmente imaginar o que ela deveria fazer: que parâmetros iriam dar que resultados. Durante o desenvolvimento, podemos analisar a função executando-a e comparando o resultado obtido ao esperado. Por exemplo, podemos fazê-lo na consola. @@ -12,7 +12,7 @@ Se algo estiver errado -- então corrigimos o código, executamos de novo, verif Mas, tais "re-execuções" manuais são imperfeitas. -**Ao testar código com re-execuções manuais, é fácil olvidar alguma coisa.** +**Ao testar código com re-execuções manuais, é fácil esquecer alguma coisa.** Por exemplo, estamos a criar uma função `f`. Escrevemos algum código, e testamos: `f(1)` funciona, mas `f(2)` não. Corrigimos o código e agora `f(2)` funciona. Parece completo? Mas, nos esquecemos de re-testar `f(1)`. Que pode estar agora a produzir um erro. @@ -20,7 +20,7 @@ Isso é muito comum. Quando desenvolvemos algo, mantemos uma quantidade de poss **Teste automatizado significa que testes são escritos separadamente, adicionalmente ao código. Eles correm as nossas funções de várias maneiras e comparam os resultados obtidos aos esperados.** -## Desenvolvimento Guiado por Comportamento (Behavior Driven Desenvolvimento [BDD]) +## Desenvolvimento Guiado por Comportamento (Behavior Driven Development [BDD]) Vamos começar por uma técnica chamada [Desenvolvimento Guiado por Comportamento](https://pt.wikipedia.org/wiki/Behavior_Driven_Development), ou abreviadamente BDD (em Inglês). @@ -36,7 +36,7 @@ Essa tarefa é apenas um exemplo: existe o operador `**` em JavaScript que pode Antes de criarmos o código de `pow`, podemos imaginar o que a função deveria fazer e descrevê-lo (*describe it*). -Tal descrição é chamada de *especificação*, ou abreviadamente uma *spec*, e contém descrições de casos exemplo (*use cases*) acompanhados de testes para eles, como por exemplo: +Tal descrição é chamada de *especificação*, ou abreviadamente uma *spec*, e contém descrições de casos exemplo (*use cases*) acompanhadas de testes para eles, como por exemplo: ```js describe("pow", function() { @@ -51,7 +51,7 @@ describe("pow", function() { Uma *spec* tem três principais blocos construtores, como pode ver acima: `describe("título", function() { ... })` -: Que funcionalidade estamos a descrever. No nosso caso, estamos a descrever a função `pow`. São usados para agrupar "executores" ("*workers*") -- os blocos `it`. +: Que funcionalidade estamos a descrever. No nosso caso, estamos a descrever a função `pow`. É usado para agrupar "executores" ("*workers*") -- os blocos `it`. `it("descrição do caso exemplo", function() { ... })` : No título de `it` nós, *de uma forma claramente legível*, descrevemos o caso exemplo em questão, e no segundo argumento está uma função que o testa. @@ -59,9 +59,7 @@ Uma *spec* tem três principais blocos construtores, como pode ver acima: `assert.equal(valor1, valor2)` : O código dentro do bloco `it`, se a implementação estiver correta, não deverá mostrar erros. -```text Funções `assert.*` são usadas para verificar se `pow` funciona como esperado. Aqui mesmo, estamos a usar uma delas -- `assert.equal`, que compara argumentos e dá como resultado um erro se eles não forem iguais. Aqui, ela verifica se o resultado de `pow(2, 3)` é `8`. Existem outros tipos de comparações e verificações, que adicionaremos mais adiante. -``` A especificação pode ser executada, e irá correr o teste especificado no bloco `it`. O que veremos mais adiante. @@ -71,9 +69,9 @@ Geralmente, o fluxo de desenvolvimento se assemelha a: 1. Uma *spec* inicial é escrita, com testes para a mais básica funcionalidade. 2. Uma implementação inicial é criada. -3. Para verificar se ela funciona, nós corremos a infraestrutura de teste [Mocha](http://mochajs.org/) (mais detalhes em breve) que corre a *spec*. Enquanto a funcionalidade não estiver completa, erros são mostrados. Nós a corrigimos até que tudo funcione. +3. Para verificar se ela funciona, nós corremos a infraestrutura de testes [Mocha](http://mochajs.org/) (mais detalhes em breve) que corre a *spec*. Enquanto a funcionalidade não estiver completa, erros são mostrados. Nós a corrigimos até que tudo funcione. 4. Agora, temos uma implementação inicial a funcionar com testes. -5. Adicionamos mais casos exemplo (*use cases*) à *spec*, provávelmente ainda não suportados pelas implementações. Testes começam a falhar. +5. Adicionamos mais casos exemplo (*use cases*) à *spec*, provavelmente ainda não suportados pelas implementações. Os testes começam a falhar. 6. Vamos para 3, atualizamos a implementação até que os testes nâo forneçam erros. 7. Repetimos os passos 3-6 até que a funcionalidade esteja pronta. @@ -81,27 +79,26 @@ Assim, o desenvolvimento é *iterativo*. Nós escrevemos a *spec*, a implementam Vejamos este fluxo de desenvolvimento no nosso caso prático. -O primeiro passo já está completo: nós temos uma *spec* inicial para `pow`. Agora, antes de fazer a implementação, vamos utilizar umas poucas bibliotecas (*libraries*) de JavaScript para executar os testes, apenas para ver se eles estão a funcionar (todos irão falhar). +O primeiro passo já está completo: nós temos uma *spec* inicial para `pow`. Agora, antes de fazermos a implementação, vamos utilizar umas poucas bibliotecas (*libraries*) de JavaScript para executar os testes, apenas para ver se eles estão a funcionar (todos irão falhar). ## A *spec* em ação Aqui, no tutorial, nós iremos usar as seguintes bibliotecas de JavaScript para testes: - [Mocha](http://mochajs.org/) -- a infraestrutura principal: ela fornece funções de teste comuns, incluindo `describe` e `it` e a principal função que executa os testes. -- [Chai](http://chaijs.com) -- a biblioteca (*library*) com muitas *asserções*. Ela permite usar muitas diferentes *asserções*; por ora, nós precisamos de apenas `assert.equal`. -- [Sinon](http://sinonjs.org/) -- a biblioteca para espiar sobre funções, simular funções incorporadas (built-in) e mais; nós a vamos precisar muito mais tarde. +- [Chai](http://chaijs.com) -- uma biblioteca (*library*) com muitas *asserções*. Ela permite usar muitas diferentes *asserções*; por ora, nós apenas precisamos de `assert.equal`. +- [Sinon](http://sinonjs.org/) -- uma biblioteca para espiar sobre funções, simular funções incorporadas (built-in) e mais; nós a vamos precisar muito mais tarde. -Estas bibliotecas, são adequadas a testes quer usando um navegador (*in-browser*) como efetuados num servidor (*server-side*). Aqui, nós vamos considerar a variante do navegador. +Estas bibliotecas, são adequadas a testes quer num navegador (*in-browser*) como num servidor (*server-side*). Aqui, nós vamos considerar a variante do navegador. A página HTML completa, com estas infraestruturas e a *spec* `pow`: -```html - src="index.html" +```html src="index.html" ``` A página pode ser dividida em cinco partes: -1. A `
` -- adiciona bibliotecas de terceiros (*third-party*) e estilos para testes. +1. A `` -- adiciona bibliotecas de terceiros (*third-party*) e estilos para os testes. 2. O ` @@ -12,17 +12,17 @@ - + - + diff --git a/1-js/03-code-quality/05-testing-mocha/beforeafter.view/test.js b/1-js/03-code-quality/05-testing-mocha/beforeafter.view/test.js index 08e27c9fd..5c2767f2e 100644 --- a/1-js/03-code-quality/05-testing-mocha/beforeafter.view/test.js +++ b/1-js/03-code-quality/05-testing-mocha/beforeafter.view/test.js @@ -1,15 +1,16 @@ describe("teste", function() { + // Mocha, geralmente espera pelos testes por 2 segundos antes de os considerar errados this.timeout(200000); // Com este código nós aumentamos esse tempo - neste caso, para 200,000 - // Isto, por causa da função "alert", porque se você se demorar a pressionar o botão "OK" oos testes não irão passar! - - before(() => alert("Testes iniciados – antes de todos os testes")); - after(() => alert("Testes terminados – depois de todos os testes")); + // Isto, por causa da função "alert", porque se você se demorar a pressionar o botão "OK" os testes não irão passar! + + before(() => alert("Testes começam – antes de todos os testes")); + after(() => alert("Testes terminam – depois de todos os testes")); - beforeEach(() => alert("antes de um teste – entrando para um teste")); - afterEach(() => alert("depois de um teste – saindo de um teste")); + beforeEach(() => alert("Antes de um teste – entrando para um teste")); + afterEach(() => alert("Depois de um teste – saindo de um teste")); it('teste 1', () => alert(1)); it('teste 2', () => alert(2)); diff --git a/1-js/03-code-quality/05-testing-mocha/index.html b/1-js/03-code-quality/05-testing-mocha/index.html index 1670c8a58..6326c9751 100644 --- a/1-js/03-code-quality/05-testing-mocha/index.html +++ b/1-js/03-code-quality/05-testing-mocha/index.html @@ -1,28 +1,33 @@ - + - + + + - + diff --git a/1-js/03-code-quality/05-testing-mocha/pow-1.view/index.html b/1-js/03-code-quality/05-testing-mocha/pow-1.view/index.html index c96134b83..d201104a5 100644 --- a/1-js/03-code-quality/05-testing-mocha/pow-1.view/index.html +++ b/1-js/03-code-quality/05-testing-mocha/pow-1.view/index.html @@ -1,7 +1,7 @@ - + @@ -12,7 +12,7 @@ @@ -25,10 +25,10 @@ } - + - + diff --git a/1-js/03-code-quality/05-testing-mocha/pow-2.view/index.html b/1-js/03-code-quality/05-testing-mocha/pow-2.view/index.html index adbd7a482..611225ee1 100644 --- a/1-js/03-code-quality/05-testing-mocha/pow-2.view/index.html +++ b/1-js/03-code-quality/05-testing-mocha/pow-2.view/index.html @@ -1,9 +1,9 @@ - + - + @@ -21,14 +21,14 @@ - + - + diff --git a/1-js/03-code-quality/05-testing-mocha/pow-2.view/test.js b/1-js/03-code-quality/05-testing-mocha/pow-2.view/test.js index e75c688d4..d36916796 100644 --- a/1-js/03-code-quality/05-testing-mocha/pow-2.view/test.js +++ b/1-js/03-code-quality/05-testing-mocha/pow-2.view/test.js @@ -1,10 +1,10 @@ describe("pow", function() { - it("2 elevado à potência 3 é 8", function() { + it("2 elevado à potência 3 são 8", function() { assert.equal(pow(2, 3), 8); }); - it("3 elevado à potência 4 é 81", function() { + it("3 elevado à potência 4 são 81", function() { assert.equal(pow(3, 4), 81); }); diff --git a/1-js/03-code-quality/05-testing-mocha/pow-3.view/index.html b/1-js/03-code-quality/05-testing-mocha/pow-3.view/index.html index 29263c61c..c7db38942 100644 --- a/1-js/03-code-quality/05-testing-mocha/pow-3.view/index.html +++ b/1-js/03-code-quality/05-testing-mocha/pow-3.view/index.html @@ -1,7 +1,7 @@ - + @@ -12,7 +12,7 @@ @@ -31,10 +31,10 @@ } - + - + diff --git a/1-js/03-code-quality/05-testing-mocha/pow-4.view/index.html b/1-js/03-code-quality/05-testing-mocha/pow-4.view/index.html index 29263c61c..c7db38942 100644 --- a/1-js/03-code-quality/05-testing-mocha/pow-4.view/index.html +++ b/1-js/03-code-quality/05-testing-mocha/pow-4.view/index.html @@ -1,7 +1,7 @@ - + @@ -12,7 +12,7 @@ @@ -31,10 +31,10 @@ } - + - + diff --git a/1-js/03-code-quality/05-testing-mocha/pow-full.view/index.html b/1-js/03-code-quality/05-testing-mocha/pow-full.view/index.html index 9a7ae12ca..6044d0527 100644 --- a/1-js/03-code-quality/05-testing-mocha/pow-full.view/index.html +++ b/1-js/03-code-quality/05-testing-mocha/pow-full.view/index.html @@ -1,7 +1,7 @@ - + @@ -12,7 +12,7 @@ @@ -32,10 +32,10 @@ } - + - + diff --git a/1-js/03-code-quality/05-testing-mocha/pow-min.view/index.html b/1-js/03-code-quality/05-testing-mocha/pow-min.view/index.html index 9af5ba188..4f9171d28 100644 --- a/1-js/03-code-quality/05-testing-mocha/pow-min.view/index.html +++ b/1-js/03-code-quality/05-testing-mocha/pow-min.view/index.html @@ -1,7 +1,7 @@ - + @@ -12,7 +12,7 @@ @@ -21,14 +21,14 @@ - + - + diff --git a/1-js/03-code-quality/05-testing-mocha/pow-nan.view/index.html b/1-js/03-code-quality/05-testing-mocha/pow-nan.view/index.html index f582f3cde..342c354aa 100644 --- a/1-js/03-code-quality/05-testing-mocha/pow-nan.view/index.html +++ b/1-js/03-code-quality/05-testing-mocha/pow-nan.view/index.html @@ -1,7 +1,7 @@ - + @@ -12,7 +12,7 @@ @@ -29,10 +29,10 @@ } - + - + diff --git a/1-js/03-code-quality/05-testing-mocha/pow-nan.view/test.js b/1-js/03-code-quality/05-testing-mocha/pow-nan.view/test.js index 02b18647f..a18e60ed5 100644 --- a/1-js/03-code-quality/05-testing-mocha/pow-nan.view/test.js +++ b/1-js/03-code-quality/05-testing-mocha/pow-nan.view/test.js @@ -4,7 +4,7 @@ describe("pow", function() { function makeTest(x) { let expected = x * x * x; - it(`${x} na potência 3 é ${expected}`, function() { + it(`${x} na potência 3 são ${expected}`, function() { assert.equal(pow(x, 3), expected); }); }