@dhlab/e2e-autogen
Version:
Google 스프레드시트 기반 시나리오를 Playwright 테스트 스텁 코드로 자동 생성하고, 테스트 실행 결과를 다시 시트에 업데이트하는 CLI 도구
174 lines (173 loc) • 7.3 kB
JavaScript
var _CoverageSheet_instances, _CoverageSheet_writeHeader, _CoverageSheet_writeSummary, _CoverageSheet_writeSuites, _CoverageSheet_writeExecHistory, _CoverageSheet_clear, _CoverageSheet_applyHeaderStyle, _CoverageSheet_applyOutlineBorder;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CoverageSheet = void 0;
const tslib_1 = require("tslib");
const spreadsheet_sheet_1 = require("./spreadsheet-sheet");
class CoverageSheet extends spreadsheet_sheet_1.SpreadsheetSheet {
constructor() {
super(...arguments);
_CoverageSheet_instances.add(this);
}
async updateCoverage({ summary, summaryPerSuite, summaryPerExecution, }) {
const prevRows = await this.rows();
const execHeaderIdx = prevRows.findIndex((r) => r[0] === "실행일시");
const pastExecRows = execHeaderIdx === -1 ? [] : prevRows.slice(execHeaderIdx + 1);
await tslib_1.__classPrivateFieldGet(this, _CoverageSheet_instances, "m", _CoverageSheet_clear).call(this);
await tslib_1.__classPrivateFieldGet(this, _CoverageSheet_instances, "m", _CoverageSheet_writeHeader).call(this, summaryPerExecution.executedAt);
await tslib_1.__classPrivateFieldGet(this, _CoverageSheet_instances, "m", _CoverageSheet_writeSummary).call(this, summary);
await tslib_1.__classPrivateFieldGet(this, _CoverageSheet_instances, "m", _CoverageSheet_writeSuites).call(this, summaryPerSuite);
await tslib_1.__classPrivateFieldGet(this, _CoverageSheet_instances, "m", _CoverageSheet_writeExecHistory).call(this, summaryPerExecution, pastExecRows);
}
}
exports.CoverageSheet = CoverageSheet;
_CoverageSheet_instances = new WeakSet(), _CoverageSheet_writeHeader = async function _CoverageSheet_writeHeader(lastUpdatedAt) {
await this.writeAfterLastRow([
["자동화테스트 커버리지 현황"],
[`마지막 업데이트: ${lastUpdatedAt}`],
[""],
["커버리지(%) = 실행된 TC / 전체 TC"],
["통과율(%) = 실행된 TC 중 통과한 TC / 실행된 TC"],
]);
}, _CoverageSheet_writeSummary = async function _CoverageSheet_writeSummary({ totalSuites, scenarioCount, testCaseCount, coverage, passRate, }) {
const startRow = (await this.rows()).length + 1;
const rows = [
[""],
["📝 요약"],
["전체 대분류 수", String(totalSuites)],
["전체 시나리오 수", String(scenarioCount)],
["전체 TC 수", String(testCaseCount)],
["커버리지(%)", String(coverage)],
["통과율(%)", String(passRate)],
];
await this.writeAfterLastRow(rows);
await tslib_1.__classPrivateFieldGet(this, _CoverageSheet_instances, "m", _CoverageSheet_applyOutlineBorder).call(this, startRow + 2, rows.length - 2, 2);
}, _CoverageSheet_writeSuites = async function _CoverageSheet_writeSuites(suites) {
if (suites.length === 0)
return;
const startRow = (await this.rows()).length + 3;
const header = [
"대분류",
"시나리오 수",
"TC 수",
"커버리지(%)",
"통과율(%)",
"Pass",
"Fail",
"Flaky",
"NotExec",
"Manual",
];
const rows = suites.map((s) => [
s.suiteId,
String(s.scenarioCount),
String(s.testCaseCount),
String(s.coverage),
String(s.passRate),
String(s.statusCounts.pass),
String(s.statusCounts.fail),
String(s.statusCounts.flaky),
String(s.statusCounts.not_executed),
String(s.statusCounts.manual_only),
]);
await this.writeAfterLastRow([[""], ["✅ 대분류별 요약"], header, ...rows]);
await tslib_1.__classPrivateFieldGet(this, _CoverageSheet_instances, "m", _CoverageSheet_applyHeaderStyle).call(this, startRow, header.length, 1);
}, _CoverageSheet_writeExecHistory = async function _CoverageSheet_writeExecHistory({ executedAt, scenarioCount, testCaseCount, coverage, passRate, statusCounts, }, pastExecRows) {
const execHeader = [
"실행일시",
"시나리오 수",
"TC 수",
"커버리지(%)",
"통과율(%)",
"Pass",
"Fail",
"Flaky",
"NotExec",
"Manual",
];
const newRow = [
executedAt,
String(scenarioCount),
String(testCaseCount),
String(coverage),
String(passRate),
String(statusCounts.pass),
String(statusCounts.fail),
String(statusCounts.flaky),
String(statusCounts.not_executed),
String(statusCounts.manual_only),
];
const execBlock = [
[""],
["✅ 실행 이력"],
execHeader,
newRow,
...pastExecRows,
];
const startRow = (await this.rows()).length + 3;
await this.writeAfterLastRow(execBlock);
await tslib_1.__classPrivateFieldGet(this, _CoverageSheet_instances, "m", _CoverageSheet_applyHeaderStyle).call(this, startRow, execHeader.length, 1);
}, _CoverageSheet_clear = async function _CoverageSheet_clear() {
const sheetName = await this.sheetName();
await this.sheets.spreadsheets.values.clear({
spreadsheetId: this.spreadsheetId,
range: `'${sheetName}'`,
});
// 스타일 초기화
await this.sheets.spreadsheets.batchUpdate({
spreadsheetId: this.spreadsheetId,
requestBody: {
requests: [
{
repeatCell: {
range: {
sheetId: Number(this.gid),
},
cell: {
userEnteredFormat: {},
},
fields: "userEnteredFormat",
},
},
],
},
});
}, _CoverageSheet_applyHeaderStyle = async function _CoverageSheet_applyHeaderStyle(startRow, colCount, rowSpan = 1) {
const requests = [
{
repeatCell: {
range: {
sheetId: Number(this.gid),
startRowIndex: startRow - 1,
endRowIndex: startRow - 1 + rowSpan,
startColumnIndex: 0,
endColumnIndex: colCount,
},
cell: {
userEnteredFormat: {
textFormat: { bold: true },
backgroundColor: { red: 0.9, green: 0.9, blue: 0.9 },
},
},
fields: "userEnteredFormat(textFormat.bold,backgroundColor)",
},
},
];
await this.applyStyle(requests);
}, _CoverageSheet_applyOutlineBorder = async function _CoverageSheet_applyOutlineBorder(startRow, rowCount, colCount) {
const req = {
updateBorders: {
range: {
sheetId: Number(this.gid),
startRowIndex: startRow - 1,
endRowIndex: startRow - 1 + rowCount,
startColumnIndex: 0,
endColumnIndex: colCount,
},
top: { style: "SOLID_THICK" },
bottom: { style: "SOLID_THICK" },
left: { style: "SOLID_THICK" },
right: { style: "SOLID_THICK" },
},
};
await this.applyStyle([req]);
};