Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Capítulo sobre Testes: Estratégia de Testes #2

Merged
merged 17 commits into from
Jul 19, 2020
Merged

Conversation

samycici
Copy link
Contributor

Introdução: manuscript/estrategia_de_testes.md
Por que escrever testes:manuscript/por_que_escrever_testes.md
Definindo testes: manuscript/definindo_testes.md
Testes Contínuos: TODO
Desafios: TODO
Como usar a estratégia de testes para tomada de decisão: TODO
Conclusão: TODO

Copy link
Owner

@gomex gomex left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Algumas sugestões pra deixar esse trabalho ainda melhor e encaixar perfeito no livro.

Comment on lines 5 to 9
```
1. Em primeiro lugar você tem um comportamento que precisa ser verificado
2. Uma entrada que vai ser passada para o seu sistema
3. Uma saída que pode ser observada
```
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Com esse ```será renderizado como código. Ideal aqui seria remover para que seja exibido como listas pelo leanpub.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removido

Comment on lines 10 to 15
- [Por que escrever Testes](por_que_escrever_testes.md)
- [Definindo Testes](definindo_testes.md)
- [Testes Contínuos](testes_continuous.md)
- [Desafios](desafios_em_testes.md)
- [Como usar a estratégia de testes para tomada de decisão](testes_e_tomada_de_decisao.md)
- [Conclusão](testes_conclusao.md)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Podemos remover ele daqui? a medida que eles forem sendo lançados, podemos colocar os links. E pareceu tb meio abrupto ter esses links ao final desse texto. O leanpub já gera o índice lá no começo.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removido

manuscript/estrategia_de_testes.md Show resolved Hide resolved
### Pequenos

#### Testes Unitários
Testes Unitários são aqueles que tem um escopo mais limitado, normalmente uma simples classe ou método. Esses testes são os que vão te ajudar no dia a dia do processo de desenvolvimento já que eles são mais rápidos de executar, devido ao escopo mais contido. Isso ajuda a otimizar a produtividade dado que esses testes podem ser executados antes de fazer o push para o repositório (vamos falar mais sobre isso no tópico sobre [Testes Contínuos](testes_continuous.md)).
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Podemos tirar esse link para o tópico que ainda não existe? Outra coisa, o link para um capítulo é feito dessa maneira: https://leanpub.com/markua/read#leanpub-auto-attribute-list-format

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removido

Comment on lines 24 to 50
```javascript
import User from '@models/User'
import mockingoose from 'mockingoose'
import Response from '@tests/utils/response'
import authController from '@controllers/auth.controller'

const user = {
name: 'Test User',
email: 'test@user.com',
password: 'password'
}

describe('The Auth Controller', () => {

it('Should register a new user with the required fields', async () => {
const request = {
body: user
}
const response = new Response()
const jsonSpy = jest.spyOn(response, 'json')

mockingoose(User).toReturn(user, 'create')

await authController.register(request, response)
expect(jsonSpy).toHaveBeenCalledWith(expect.objectContaining(accountRegistered))
})
```
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Podemos usar um exemplo mais simples? Pode ser javascript mesmo, mas pensei em um modelo de código mais simples para quem ta começando.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

alterado


Apesar desses pontos esses testes também tem sua importância principalmente por serem mais fiéis ao comportamento do usuário final. Por isso é importante avaliar o nível de fidelidade que você quer para o seus testes. Eu sei que quando falamos de testes ponta-a-ponta logo vem a cabeça a imagem da pirâmide de testes invertida, mas esqueça isso por um momento e faça uma análise crítica do quanto esses testes são importantes para o seu produto.

Existem algumsa formas de minimizar o impacto desses testes dentro do seu fluxo de entrega em produção, você pode por exemplo executar esses testes em paralelo, isso vai te fazer ganhar um pouco mais de tempo. Outra opção é criar suítes menores com um escopo mais definido, por exemplo se estamos falando de um sistema de pagamentos e temos os fluxos de transações e os fluxos de cadastro de novos clientes, você pode categorizar essas suítes e se você está fazendo uma modificação no fluxo de transações, talvez não seja necessário rodar todos os testes de cadastro.
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"algumsa"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolvido

Esse e outros testes não funcionais vão te ajudar muito a validar questões de configuração e infraestrutura, calibrar seu auto-scaling e econtrar gargalos antes que eles te surpreendam em produção.

#### Testes de Compatibilidade
Quando falamos de aplicações que tem alguma interface os testes de compatibilidade se tornam extremamente importantes já que conforme sua base de clientes vai crescendo fica impossível acompanhar manualmente os testes das diferentes versões em diferentes plataformas.
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Poderia falar um pouco mais sobre "aplicações que tem alguma interface"?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

feito

Comment on lines 236 to 283
```json
{
"id": "pokedex_test",
"viewports": [
{
"label": "tablet",
"width": 1024,
"height": 768
}
],
"onBeforeScript": "chromy/onBefore.js",
"onReadyScript": "chromy/onReady.js",
"scenarios": [
{
"label": "Pokedex Página 404",
"cookiePath": "backstop_data/engine_scripts/cookies.json",
"url": "http://localhost:3000/#/404",
"referenceUrl": "",
"readyEvent": "",
"readySelector": "",
"delay": 10000,
"hideSelectors": [],
"removeSelectors": [],
"hoverSelector": "",
"clickSelector": "",
"postInteractionWait": "",
"selectors": [],
"selectorExpansion": true,
"misMatchThreshold" : 0.1,
"requireSameDimensions": true
}
],
"paths": {
"bitmaps_reference": "backstop_data/bitmaps_reference",
"bitmaps_test": "backstop_data/bitmaps_test",
"engine_scripts": "backstop_data/engine_scripts",
"html_report": "backstop_data/html_report",
"ci_report": "backstop_data/ci_report"
},
"report": ["browser"],
"engine": "chrome",
"engineFlags": [],
"asyncCaptureLimit": 5,
"asyncCompareLimit": 50,
"debug": false,
"debugWindow": false
}
```
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esse exemplo é necessário agora? Acho que podemos tirar, uma vez que citamos a ferramenta e o que ela pode fazer. Se quiser manter, pensei em fazermos aquele trabalho de explicar parte a parte ;) particularmente acho que nesse capítulo não precisamos dele.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removido


#### Outras Verificações

Aqui temos algumas verficações bônus que vão te ajudar a elevar a barra de qualidade do seu projeto e garantir que as entregas em produção estão *tinindo*.
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tinindo ficará em itálico, é isso mesmo que quer?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolvido

Comment on lines 307 to 332
```javascript
/**
* @type {import('@stryker-mutator/api/core').StrykerOptions}
*/
module.exports = {
mutator: 'javascript',
packageManager: 'npm',
reporters: ['html', 'clear-text', 'progress', 'dashboard'],
testRunner: 'jest',
transpilers: [],
coverageAnalysis: 'off',
dashboard: {
project: 'github.com/samycici/auth-app'
},
mutate: [
'server/**/*.js'
],
jest: {
projectType: 'custom',
configFile: 'jest.config.js',
enableFindRelatedTests: false
},
timeoutMS: 15000,
tempDirName: '.stryker-tmp'
}
```
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ao invés do código, que tal colocar a foto do dashboard?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolvido

}
}
```

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ficou melhor o exemplo novo, mas tem como detalhar um pouco a explicação do código?

- Stub: diferentes dos spies, os stubs conseguem mudar comportamentos, dependendo de como forem chamados, permitindo testar mais cenários. Pode ser usado inclusive para testar código assíncrono.

- Mock: os mocks são capazes de substituir a dependência permitindo assim verificar vários comportamentos. Você pode utilizar por exemplo para verificar se uma função foi chamada e se ela foi chamada com os argumentos esperados.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ficou melhor o exemplo novo, mas tem como detalhar um pouco a explicação do código?

Comment on lines +119 to +131
```javascript
describe('PokemonsController get()', () => {
it('should find a pokemon from database with correct parameters', () => {
const find = sinon.spy(Database, 'find');

const pokemonsController = new PokemonsController(Database);
pokemonsController.getPokemon();

sinon.assert.calledWith(find, 'pokemon');
find.restore();
});
});
```
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tem como detalhar um pouco a explicação do código?

Comment on lines +135 to +156
```javascript
describe('PokemonsController getPokemon()', () => {
it('should return a pokemon info', () => {
const databaseResponse = {
id: 1,
name: 'Pikachu',
species: 'mouse',
type: 'eletric'
};

const find = sinon.stub(Database, 'find');
find.withArgs('pokemon').returns(databaseResponse);

const pokemonsController = new PokemonsController(Database);
const response = pokemonController.getPokemon();

sinon.assert.calledWith(find, 'pokemon');
expect(response).to.be.eql(databaseResponse);
find.restore();
});
});
```
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ficou melhor o exemplo novo, mas tem como detalhar um pouco a explicação do código?

Comment on lines +160 to +173
```javascript
describe('PokemonController get()', () => {
it('should call database with correct arguments', () => {
const databaseMock = sinon.mock(Database);
databaseMock.expects('find').once().withArgs('pokemon');

const pokemonsController = new PokemonsController(Database);
pokemonsController.get();

databaseMock.verify();
databaseMock.restore();
});
});
```
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ficou melhor o exemplo novo, mas tem como detalhar um pouco a explicação do código?

@gomex gomex merged commit d53b3dd into gomex:master Jul 19, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants