forked from apside-qualite/cypress-seed
parent
9ef97f4872
commit
124d54936e
@ -0,0 +1,49 @@ |
|||||||
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. |
||||||
|
.gradle/* |
||||||
|
.settings/* |
||||||
|
.project |
||||||
|
.classpath |
||||||
|
.idea/* |
||||||
|
!.idea/runConfigurations |
||||||
|
*.iws |
||||||
|
*.iml |
||||||
|
*.ipr |
||||||
|
|
||||||
|
# dependencies |
||||||
|
/node_modules |
||||||
|
/.pnp |
||||||
|
.pnp.js |
||||||
|
|
||||||
|
# testing |
||||||
|
/coverage |
||||||
|
/testResults |
||||||
|
.scannerwork/* |
||||||
|
|
||||||
|
# Storybook |
||||||
|
/storybook-static |
||||||
|
|
||||||
|
# production |
||||||
|
**/build |
||||||
|
**/build_* |
||||||
|
|
||||||
|
# misc |
||||||
|
.DS_Store |
||||||
|
.env.local |
||||||
|
.env.development.local |
||||||
|
.env.test.local |
||||||
|
.env.production.local |
||||||
|
|
||||||
|
npm-debug.log* |
||||||
|
yarn-debug.log* |
||||||
|
yarn-error.log* |
||||||
|
|
||||||
|
#Docker |
||||||
|
docker-compose.yml |
||||||
|
|
||||||
|
#cypress |
||||||
|
.nyc_output/ |
||||||
|
.nyc_coverage/ |
||||||
|
cypress/screenshots/ |
||||||
|
cypress/videos/ |
||||||
|
cypress/reports/ |
||||||
|
mocha_reports/ |
@ -1,2 +1,69 @@ |
|||||||
# cypress-seed |
# Cypress Seed |
||||||
|
|
||||||
|
Ce seed permet de demarrer un projet de test automatisé pour n'importe quel client ou application web en utilisant le framwork CYPRESS ==> https://www.cypress.io/ |
||||||
|
|
||||||
|
**NOTE** : Ce Repo restera un SEED qui evolura. Pour vos test faite un fork de ce seed |
||||||
|
|
||||||
|
### Prerequis |
||||||
|
|
||||||
|
- node v12 ou + et npm 6.14 ou + |
||||||
|
|
||||||
|
### Dependance |
||||||
|
|
||||||
|
| Dependance | Version | Obligatoire | |
||||||
|
|---|---|---| |
||||||
|
| __typescript__ | 3.8.3 | X | |
||||||
|
| __cypress__ | 5.2.0 | X | |
||||||
|
| __mochawesome__ | 6.1.1 | X | |
||||||
|
|
||||||
|
## Get Started |
||||||
|
|
||||||
|
faire un git clone du projet : |
||||||
|
```bash |
||||||
|
$ git clone https://gitea.ci.apside-top.fr/apside-qualite/cypress-seed.git |
||||||
|
``` |
||||||
|
|
||||||
|
Installer toutes les dependance avec npm |
||||||
|
```bash |
||||||
|
$ cd ./cypress-seed |
||||||
|
$ npm install |
||||||
|
``` |
||||||
|
|
||||||
|
Ouvrir Cypress |
||||||
|
```bash |
||||||
|
$ npm run cypress:open:dev |
||||||
|
``` |
||||||
|
|
||||||
|
![alt text](./docs/capture-open.gif "Openning cypress") |
||||||
|
|
||||||
|
|
||||||
|
Cliquer sur ``apside.spec.ts`` |
||||||
|
|
||||||
|
Tous les test présent dans ``apside.spec.ts`` vont être joués |
||||||
|
|
||||||
|
![alt text](./docs/capture-running.gif "Running test") |
||||||
|
|
||||||
|
|
||||||
|
Genere les rapport mochawesome |
||||||
|
```bash |
||||||
|
$ npm run generate:report:dev |
||||||
|
``` |
||||||
|
|
||||||
|
cela va genere un repertoire ``mocha_reports`` avec un rapport detailé et beau ;-) de tous vos tests |
||||||
|
|
||||||
|
puis ouvrir ``output.html`` |
||||||
|
|
||||||
|
![alt text](./docs/capture-repports.png "Mocha report") |
||||||
|
|
||||||
|
## Premier test avec Cypress |
||||||
|
|
||||||
|
// TODO Donner 2 3 exemple de Comment créer un test |
||||||
|
|
||||||
|
**NOTE** : 2 configuration sont actuellement disponible |
||||||
|
|
||||||
|
// TODO expliquer les 2 config dev et local |
||||||
|
|
||||||
|
# RELEASE |
||||||
|
|
||||||
|
## 0.0.1 (_23/09/2020_) |
||||||
|
- initialisation __cypress__ et les rapport __mochawesome__ |
@ -0,0 +1,12 @@ |
|||||||
|
{ |
||||||
|
"chromeWebSecurity": false, |
||||||
|
"viewportWidth": 1280, |
||||||
|
"viewportHeight": 770, |
||||||
|
"video": false, |
||||||
|
"ignoreErrors": ["ResizeObserver"], |
||||||
|
"requestTimeout": 13000, |
||||||
|
"reporter": "cypress-multi-reporters", |
||||||
|
"reporterOptions": { |
||||||
|
"configFile": "reporterOptions.json" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
{ |
||||||
|
"baseUrl": "https://apside.com/", |
||||||
|
"env": { |
||||||
|
"username": "test", |
||||||
|
"password": "Password@2020" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
{ |
||||||
|
"baseUrl": "https://localhost:9000/", |
||||||
|
"env": { |
||||||
|
"username": "test", |
||||||
|
"password": "Password@2020" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
{ |
||||||
|
"name": "Using fixtures to represent data", |
||||||
|
"email": "hello@cypress.io", |
||||||
|
"body": "Fixtures are a great way to mock data for responses to routes" |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
import {goToCompoundDashboard} from '../../support/common/action.spec'; |
||||||
|
|
||||||
|
describe('Test Page d\'accueil APSIDE .com', () => { |
||||||
|
beforeEach(() => { |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
it('Visité apside.com ', function() { |
||||||
|
cy.visit('/'); |
||||||
|
cy.get('.titreBigOrange').should('be.visible'); |
||||||
|
cy.get('.titreBigOrange').should('have.text', 'INNOVATION'); |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
it('Visité et trouver APSIDE TOURS ', function() { |
||||||
|
cy.visit('/'); |
||||||
|
cy.get('.search_menu').click(); |
||||||
|
cy.get('#search').type('TOURS'); |
||||||
|
cy.get('#search_btn').click(); |
||||||
|
cy.get('.first > .lanceurBlog > .texte > .intro > .btn-plus2').click(); |
||||||
|
|
||||||
|
cy.get('.titreBigBleu').should('be.visible'); |
||||||
|
cy.get('.titreBigBleu').should('have.text', 'Apside Tours'); |
||||||
|
});1 |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,38 @@ |
|||||||
|
/// <reference types="cypress" />
|
||||||
|
|
||||||
|
// ***********************************************************
|
||||||
|
// This example plugins/index.js can be used to load plugins
|
||||||
|
//
|
||||||
|
// You can change the location of this file or turn off loading
|
||||||
|
// the plugins file with the 'pluginsFile' configuration option.
|
||||||
|
//
|
||||||
|
// You can read more here:
|
||||||
|
// https://on.cypress.io/plugins-guide
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// This function is called when a project is opened or re-opened (e.g. due to
|
||||||
|
// the project's config changing)
|
||||||
|
// @ts-ignore
|
||||||
|
const fs = require('fs-extra'); |
||||||
|
const path = require('path'); |
||||||
|
|
||||||
|
function getConfigurationByFile (file) { |
||||||
|
const pathToConfigFile = path.resolve( 'cypress', 'config', `cypress.${file}.json`) |
||||||
|
return fs.readJSONSync(pathToConfigFile) |
||||||
|
} |
||||||
|
/** |
||||||
|
* @type {Cypress.PluginConfig} |
||||||
|
*/ |
||||||
|
module.exports = (on, config) => { |
||||||
|
const file = config.env.configFile || 'local'; |
||||||
|
Object.assign(config, getConfigurationByFile(file)); |
||||||
|
if(file === 'local') { |
||||||
|
// No need to activate code coverage task for dev or other environnement because code is not instrumented for coverage
|
||||||
|
require('@cypress/code-coverage/task')(on, config); |
||||||
|
} |
||||||
|
// include any other plugin code...
|
||||||
|
// IMPORTANT to return the config object
|
||||||
|
// with the any changed environment variables
|
||||||
|
return config |
||||||
|
} |
||||||
|
|
@ -0,0 +1,44 @@ |
|||||||
|
class Forms { |
||||||
|
EmptyFormCompound(){ |
||||||
|
cy.get('#securityGroup').click() |
||||||
|
cy.get('#name').click() |
||||||
|
cy.get('#securityGroup-helper-text').should('have.text', 'Security group is required'); |
||||||
|
cy.get('#name').click() |
||||||
|
cy.get('#alias').click; |
||||||
|
cy.get('#name-helper-text').should('be.visible'); |
||||||
|
cy.get('#alias').click() |
||||||
|
cy.get('#name-helper-text').should('have.text', 'Must not be null'); |
||||||
|
|
||||||
|
cy.get('.space-form > .space-autocomplete > .MuiAutocomplete-root > .MuiFormControl-root > .MuiInputBase-root > input').click(); |
||||||
|
cy.get('#description').click({ force: true }); |
||||||
|
|
||||||
|
cy.get('#description').click() |
||||||
|
|
||||||
|
cy.get('#lead-helper-text').should('be.visible'); |
||||||
|
cy.get('#lead-helper-text').should('have.text', 'Field \'securityGroup\' must be set'); |
||||||
|
|
||||||
|
cy.get('.MuiDialogActions-root > :nth-child(2)').should('be.disabled'); |
||||||
|
|
||||||
|
} |
||||||
|
EmptyFormStudy(){ |
||||||
|
cy.get('#compoundName').should('be.disabled') |
||||||
|
cy.get('#name').click() |
||||||
|
cy.get('#alias').click() |
||||||
|
cy.get('#name-helper-text').should('be.visible'); |
||||||
|
cy.get('#name-helper-text').should('have.text','Must not be null'); |
||||||
|
cy.get('#name-helper-text').should('have.text', 'Must not be null'); |
||||||
|
|
||||||
|
cy.get('.space-form > .space-autocomplete > .MuiAutocomplete-root > .MuiFormControl-root > .MuiInputBase-root > input').click(); |
||||||
|
cy.get('#description').click({ force: true }); |
||||||
|
|
||||||
|
cy.get('#description').click() |
||||||
|
|
||||||
|
cy.get('#lead-helper-text').should('be.visible'); |
||||||
|
cy.get('#lead-helper-text').should('have.text', 'Lead is required'); |
||||||
|
|
||||||
|
cy.get('.MuiDialogActions-root > :nth-child(2)').should('be.disabled'); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
export const Createforms = new Forms() |
@ -0,0 +1,25 @@ |
|||||||
|
// ***********************************************
|
||||||
|
// This example commands.js shows you how to
|
||||||
|
// create various custom commands and overwrite
|
||||||
|
// existing commands.
|
||||||
|
//
|
||||||
|
// For more comprehensive examples of custom
|
||||||
|
// commands please read more here:
|
||||||
|
// https://on.cypress.io/custom-commands
|
||||||
|
// ***********************************************
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a parent command --
|
||||||
|
// Cypress.Commands.add("login", (email, password) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a child command --
|
||||||
|
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a dual command --
|
||||||
|
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This will overwrite an existing command --
|
||||||
|
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
|
@ -0,0 +1,11 @@ |
|||||||
|
import * as faker from 'faker'; |
||||||
|
|
||||||
|
// Compound's Actions
|
||||||
|
export function openSearchBar() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
export function search(query: String) { |
||||||
|
|
||||||
|
} |
||||||
|
|
@ -0,0 +1,5 @@ |
|||||||
|
/// <reference types="Cypress"/>
|
||||||
|
// Field validator
|
||||||
|
export function fieldErrorValidator(){ |
||||||
|
|
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
// ***********************************************************
|
||||||
|
// This example support/index.js is processed and
|
||||||
|
// loaded automatically before your test files.
|
||||||
|
//
|
||||||
|
// This is a great place to put global configuration and
|
||||||
|
// behavior that modifies Cypress.
|
||||||
|
//
|
||||||
|
// You can change the location of this file or turn off
|
||||||
|
// automatically serving support files with the
|
||||||
|
// 'supportFile' configuration option.
|
||||||
|
//
|
||||||
|
// You can read more here:
|
||||||
|
// https://on.cypress.io/configuration
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// Import commands.js using ES2015 syntax:
|
||||||
|
import './commands'; |
||||||
|
import '@cypress/code-coverage/support'; |
||||||
|
import addContext from 'mochawesome/addContext' |
||||||
|
|
||||||
|
Cypress.Screenshot.defaults({ |
||||||
|
screenshotOnRunFailure: true |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
// Cypress.env('compoundName', 'cy_' + faker.name.lastName().toLowerCase());
|
||||||
|
// Cypress.env('compoundAlias', 'alias_' + Cypress.env('compoundName'));
|
||||||
|
|
||||||
|
|
||||||
|
Cypress.on('test:after:run', (test, runnable: Mocha.Suite) => { |
||||||
|
if (test.state === 'failed') { |
||||||
|
let item = runnable; |
||||||
|
const nameParts = [runnable.title] |
||||||
|
|
||||||
|
// Iterate through all parents and grab the titles
|
||||||
|
while (item.parent) { |
||||||
|
nameParts.unshift(item.parent.title) |
||||||
|
//tslint:disable-next-line
|
||||||
|
item = item.parent |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
const fullTestName = nameParts |
||||||
|
.filter(Boolean) |
||||||
|
.join(' -- ') // this is how cypress joins the test title fragments
|
||||||
|
|
||||||
|
const imageUrl = `screenshots/${ |
||||||
|
Cypress.spec.name |
||||||
|
}/${fullTestName} (failed).png` |
||||||
|
|
||||||
|
addContext({ test }, imageUrl) |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
// Alternatively you can use CommonJS syntax:
|
||||||
|
// require('./commands')
|
@ -0,0 +1,12 @@ |
|||||||
|
{ |
||||||
|
"extends": "../tsconfig.json", |
||||||
|
"compilerOptions": { |
||||||
|
"strict": true, |
||||||
|
"baseUrl": "../node_modules", |
||||||
|
"types": ["cypress"] |
||||||
|
}, |
||||||
|
"include": [ |
||||||
|
"**/*.ts", |
||||||
|
"../node_modules/@types/node/globals.d.ts" |
||||||
|
] |
||||||
|
} |
After Width: | Height: | Size: 656 KiB |
After Width: | Height: | Size: 75 KiB |
After Width: | Height: | Size: 4.9 MiB |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,47 @@ |
|||||||
|
{ |
||||||
|
"name": "space-e2e-test-automation", |
||||||
|
"version": "0.0.1", |
||||||
|
"private": true, |
||||||
|
"scripts": { |
||||||
|
"report:combine:reports": "mochawesome-merge cypress/reports/mocha/*.json > cypress/reports/output.json", |
||||||
|
"report:generate:report": "marge cypress/reports/output.json -f output -o mocha_reports/", |
||||||
|
"report:copyScreenshots": "cp -r cypress/screenshots mocha_reports || exit 0", |
||||||
|
"cypress:open": "cypress open", |
||||||
|
"cypress:run": "cypress run", |
||||||
|
"cypress:open:dev": "cypress open --env configFile=dev", |
||||||
|
"cypress:run:dev": "cypress run --env configFile=dev || exit 0", |
||||||
|
"precypress:open:dev": "rm -rf cypress/screenshots/* || exit 0", |
||||||
|
"precypress:run:dev": "rm -rf cypress/screenshots cypress/reports/* mocha_reports/*", |
||||||
|
"generate:report:dev": "npm run cypress:run:dev & npm run report:combine:reports & npm run report:generate:report & npm run report:copyScreenshots" |
||||||
|
}, |
||||||
|
"browserslist": { |
||||||
|
"production": [ |
||||||
|
">0.2%", |
||||||
|
"not dead", |
||||||
|
"not op_mini all" |
||||||
|
], |
||||||
|
"development": [ |
||||||
|
"last 1 chrome version", |
||||||
|
"last 1 firefox version", |
||||||
|
"last 1 safari version" |
||||||
|
] |
||||||
|
}, |
||||||
|
"devDependencies": { |
||||||
|
"@cypress/code-coverage": "^3.8.1", |
||||||
|
"@testdeck/mocha": "^0.1.0", |
||||||
|
"@types/classnames": "~2.2.10", |
||||||
|
"@types/mocha": "^8.0.3", |
||||||
|
"@types/node": "~12.0.10", |
||||||
|
"cypress": "^5.2.0", |
||||||
|
"cypress-multi-reporters": "^1.4.0", |
||||||
|
"faker": "~4.1.0", |
||||||
|
"mocha": "^8.1.3", |
||||||
|
"mochawesome": "^6.1.1", |
||||||
|
"mochawesome-merge": "^4.1.0", |
||||||
|
"mochawesome-report-generator": "^5.1.0", |
||||||
|
"tslint": "~5.18.0", |
||||||
|
"tslint-react": "~4.2.0", |
||||||
|
"typescript": "3.8.3", |
||||||
|
"typescript-tslint-plugin": "~0.5.5" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
{ |
||||||
|
"reporterEnabled": "mochawesome", |
||||||
|
"mochawesomeReporterOptions": { |
||||||
|
"reportDir": "cypress/reports/mocha", |
||||||
|
"quiet": true, |
||||||
|
"overwrite": false, |
||||||
|
"html": false, |
||||||
|
"json": true |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
{ |
||||||
|
"compilerOptions": { |
||||||
|
"target": "es5", |
||||||
|
"lib": [ |
||||||
|
"dom", |
||||||
|
"dom.iterable", |
||||||
|
"esnext" |
||||||
|
], |
||||||
|
"strictPropertyInitialization": false, |
||||||
|
"allowJs": true, |
||||||
|
"skipLibCheck": true, |
||||||
|
"esModuleInterop": true, |
||||||
|
"allowSyntheticDefaultImports": true, |
||||||
|
"strict": true, |
||||||
|
"forceConsistentCasingInFileNames": true, |
||||||
|
"module": "esnext", |
||||||
|
"moduleResolution": "node", |
||||||
|
"resolveJsonModule": true, |
||||||
|
"isolatedModules": true, |
||||||
|
"noEmit": true, |
||||||
|
"jsx": "preserve", |
||||||
|
"noImplicitAny": false |
||||||
|
}, |
||||||
|
"include": [ |
||||||
|
"src" |
||||||
|
], |
||||||
|
"plugins": [{ |
||||||
|
"name": "typescript-tslint-plugin", |
||||||
|
"configFile": "tslint.json" |
||||||
|
}] |
||||||
|
} |
Loading…
Reference in new issue