-
Notifications
You must be signed in to change notification settings - Fork 27
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
Conversation
There was a problem hiding this 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.
``` | ||
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 | ||
``` |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
Outdated
- [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) |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removido
manuscript/definindo_testes.md
Outdated
### 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)). |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removido
manuscript/definindo_testes.md
Outdated
```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)) | ||
}) | ||
``` |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alterado
manuscript/definindo_testes.md
Outdated
|
||
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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"algumsa"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
resolvido
manuscript/definindo_testes.md
Outdated
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. |
There was a problem hiding this comment.
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"?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
feito
manuscript/definindo_testes.md
Outdated
```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 | ||
} | ||
``` |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removido
manuscript/definindo_testes.md
Outdated
|
||
#### 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*. |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
resolvido
manuscript/definindo_testes.md
Outdated
```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' | ||
} | ||
``` |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
resolvido
} | ||
} | ||
``` | ||
|
There was a problem hiding this comment.
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. | ||
|
There was a problem hiding this comment.
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?
```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(); | ||
}); | ||
}); | ||
``` |
There was a problem hiding this comment.
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?
```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(); | ||
}); | ||
}); | ||
``` |
There was a problem hiding this comment.
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?
```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(); | ||
}); | ||
}); | ||
``` |
There was a problem hiding this comment.
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?
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