Как меня слышно && видно? Вкл запись!!!
Если нет – напишите, если слышите – смайлик в чат.
3
Test quality tools
Какие инструменты помогают писать код
Общие рекомендации
Правила написания тестов
Правила написания тестов
describe("Login Saga", () => {
describe("Login success", () => {
it("checkUserSession with not-empty username success", () => {
Программируйте тесты в декларативном стиле
it("When asking for an admin, ensure only ordered admins in results", () => {
//assuming we've added here two admins "admin1", "admin2" and "user1"
const allAdmins = getUsers({ adminOnly: true });
const admin1Found, adming2Found = false;
allAdmins.forEach((aSingleUser) => {
if (aSingleUser === "user1") {
assert.notEqual(aSingleUser, "user1", "A user was found and not admin");
}
if (aSingleUser === "admin1") {
admin1Found = true;
}
if (aSingleUser === "admin2") {
admin2Found = true;
}
});
if (!admin1Found || !admin2Found) {
throw new Error("Not all admins were returned");
}
});
Программируйте тесты в декларативном стиле
it("When asking for an admin, ensure only ordered admins in results", () => {
//assuming we've added here two admins
const allAdmins = getUsers({ adminOnly: true });
expect(allAdmins)
.to.include.ordered.members(["admin1", "admin2"])
.but.not.include.ordered.members(["user1"]);
});
Не стоит генерировать и поддерживать данные с бека
Генерируйте реалистичные данные
Не стоит проверять только удобные свойства
Группируйте тесты
Не ловите ошибки, а ожидайте их
it("When no product name, it throws error 400", async () => {
let errorWeExceptFor = null;
try {
const result = await addNewProduct({ name: 'nest' });
}
catch (error) {
expect(error.code).to.equal('InvalidInput');
errorWeExceptFor = error;
}
expect(errorWeExceptFor).not.to.be.null;
//if this assertion fails, the tests results/reports will only show
//that some value is null, there won't be a word about a missing Exception
});
Не ловите ошибки, а ожидайте их
it.only("When no product name, it throws error 400", async () => {
expect(addNewProduct)).to.eventually.throw(AppError).with.property('code', "InvalidInput");
});
Test coverage
Jest
Минимальный порог покрытия
Минимальный порог покрытия
Jest + CI
Анализируйте отчеты о покрытии
Вопросы?
eslint-plugin-jest
Предотвращение проблем тестирования с помощью тест-линтеров
Stryker mutator
Какие недостатки у традиционных метрик?
Stryker
Как использовать?
npm install --save-dev @stryker-mutator/core
npx stryker init
На выходе получаем оценки качества
Вопросы?
E2E test config
О преимуществах E2E тестов
Jest-puppeteer
GitHub Actions
Actions
Вопросы?
Спасибо
за внимание!