diff --git a/jest-setup.js b/jest-setup.js index 5e4c8351ed2a751e63527545cb0c2d1ef7eb297c..e3e98d936b744923309cf1ef72614af4e3e14a5c 100644 --- a/jest-setup.js +++ b/jest-setup.js @@ -1,19 +1,189 @@ -const path = require('path'); -const { - configureToMatchImageSnapshot -} = require('jest-image-snapshot'); - -const hbuilderx_version = process.env.HX_Version -const uniTestPlatformInfo = process.env.uniTestPlatformInfo ? process.env.uniTestPlatformInfo.replace(/\s/g,'_') : '' -const folderName = `__image_snapshots__/${hbuilderx_version}/__${uniTestPlatformInfo}__` -const baseFolderName = `__image_snapshots__/base/__${uniTestPlatformInfo}__` +const path = require("path"); +const fs = require("fs"); +const {configureToMatchImageSnapshot} = require('jest-image-snapshot'); +let saveImageSnapshotDir = process.env.saveImageSnapshotDir || path.join(__dirname, '__snapshot__'); expect.extend({ - toMatchImageSnapshot: configureToMatchImageSnapshot({ - customSnapshotIdentifier(args) { - return args.currentTestName.replace(/\//g, '-').replace(' ', '-'); - }, - customSnapshotsDir: path.join(__dirname, baseFolderName), - customDiffDir: path.join(__dirname, `${folderName}/`, 'diff'), - }), -}); \ No newline at end of file + // toMatchImageSnapshot: configureToMatchImageSnapshot({ + // customSnapshotIdentifier(args) { + // return args.currentTestName.replace(/\//g, "-").replace(" ", "-"); + // }, + // customSnapshotsDir: process.env.saveImageSnapshotDir, + // customDiffDir: path.join(saveImageSnapshotDir, "diff"), + // }), + toSaveSnapshot, + toSaveImageSnapshot, +}); + +const testCaseToSnapshotFilePath = + process.env.testCaseToSnapshotFilePath || "./testCaseToSnapshotFilePath.json"; + +if (!fs.existsSync(testCaseToSnapshotFilePath)) { + fs.writeFileSync(testCaseToSnapshotFilePath, "{}"); +} + +function writeTestCaseToSnapshotFile(testCaseName, snapshotFilePath) { + const data = JSON.parse(fs.readFileSync(testCaseToSnapshotFilePath)); + + if (testCaseName.includes(__dirname)) { + testCaseName = testCaseName.substring(`${__dirname}`.length); + if (testCaseName[0] == '/' || testCaseName[0] == '\\') { + testCaseName = testCaseName.substring(1); + }; + }; + + if (!data[testCaseName]) { + data[testCaseName] = [snapshotFilePath]; + } else { + data[testCaseName].push(snapshotFilePath); + } + fs.writeFileSync(testCaseToSnapshotFilePath, JSON.stringify(data, null, 2)); +} + +function toSaveSnapshot(received, { + customSnapshotsDir, + fileName +} = {}) { + const { + snapshotState: { + _rootDir + }, + testPath, + currentTestName, + } = this; + const SNAPSHOTS_DIR = "__file_snapshots__"; + const snapshotDir = + process.env.saveSnapshotDir || + createSnapshotDir({ + customSnapshotsDir, + testPath, + SNAPSHOTS_DIR, + }); + const _fileName = createFileName({ + fileName, + testPath, + currentTestName, + }); + const filePath = path.join(snapshotDir, _fileName); + let message = () => `${currentTestName} toSaveSnapshot success`; + let pass = true; + + try { + checkSnapshotDir(path.dirname(filePath)); + fs.writeFileSync(filePath, received); + writeTestCaseToSnapshotFile(testPath.replace(`${_rootDir}/`, ""), filePath); + } catch (e) { + console.log("toSaveSnapshot fail", e); + message = () => e.message; + pass = false; + } + + return { + message, + pass, + }; +} + +function toSaveImageSnapshot( + received, { + customSnapshotsDir, + customSnapshotIdentifier + } = {} +) { + const { + snapshotState: { + _rootDir + }, + testPath, + currentTestName, + } = this; + const SNAPSHOTS_DIR = "__image_snapshots__"; + const snapshotDir = + process.env.saveImageSnapshotDir || + createSnapshotDir({ + customSnapshotsDir, + testPath, + SNAPSHOTS_DIR, + }); + const _fileName = createFileName({ + fileName: customSnapshotIdentifier ? `${customSnapshotIdentifier()}.png` : "", + testPath, + currentTestName, + fileType: "png", + }); + const filePath = path.join(snapshotDir, _fileName); + let message = () => `${currentTestName} toSaveImageSnapshot success`; + let pass = true; + + try { + checkSnapshotDir(path.dirname(filePath)); + fs.writeFileSync(filePath, Buffer.from(received, "base64")); + writeTestCaseToSnapshotFile(testPath.replace(`${_rootDir}/`, ""), filePath); + } catch (e) { + console.log("toSaveImageSnapshot fail", e); + message = () => e.message; + pass = false; + } + + return { + message, + pass, + }; +} + +function createSnapshotDir({ + customSnapshotsDir, + testPath, + SNAPSHOTS_DIR +}) { + return customSnapshotsDir || path.join(path.dirname(testPath), SNAPSHOTS_DIR); +} + +function createFileName({ + fileName, + testPath, + currentTestName, + fileType +}) { + return ( + fileName || + createSnapshotIdentifier({ + testPath, + currentTestName, + fileType, + }) + ); +} + +function createSnapshotIdentifier({ + testPath, + currentTestName, + fileType = "txt", +}) { + const snapshotIdentifier = kebabCase( + `${path.basename(testPath)}-${currentTestName}` + ); + const counter = timesCalled.get(`${snapshotIdentifier}-${fileType}`) || 1; + timesCalled.set(`${snapshotIdentifier}-${fileType}`, counter + 1); + return `${snapshotIdentifier}-${counter}.${fileType}`; +} + +function kebabCase(str) { + return str + .replaceAll(/([a-z])([A-Z])/g, "$1-$2") + .replaceAll(/\s+/g, "-") + .replaceAll(/_+/g, "-") + .replaceAll(/\/+/g, "-") + .replaceAll(/\.+/g, "-") + .toLowerCase(); +} + +function checkSnapshotDir(snapshotDir) { + if (!fs.existsSync(snapshotDir)) { + fs.mkdirSync(snapshotDir, { + recursive: true, + }); + } +} + +const timesCalled = new Map(); diff --git a/pages/pages.test.js b/pages/pages.test.js index d075f60bb527f1b5073fd698f7e6867501517b8f..af336f400a706f15a0674c2f291139389753d3e1 100644 --- a/pages/pages.test.js +++ b/pages/pages.test.js @@ -19,8 +19,13 @@ describe('page screenshot test', () => { console.log("page screenshot test finish"); }); test.each(pages)('%s', async () => { - const image = await program.screenshot(); - expect(image).toMatchImageSnapshot(); - await page.waitFor(500); + // const image = await program.screenshot(); + // expect(image).toMatchImageSnapshot(); + // await page.waitFor(500); + const image = await program.screenshot({ + fullPage: true + }); + expect(image).toSaveImageSnapshot(); + await page.waitFor(500); }) }) \ No newline at end of file diff --git a/pages/ucenter/ucenter.test.js b/pages/ucenter/ucenter.test.js index ab3700b385fab84acb84ff7b50359e28044e2da9..c19c997a927ba07d7899bd72f1d035d5d270b09a 100644 --- a/pages/ucenter/ucenter.test.js +++ b/pages/ucenter/ucenter.test.js @@ -55,10 +55,14 @@ describe('ucenter', () => { }) } it('screenshot',async()=>{ - await program.screenshot({ - path: "static/screenshot/ucenter.png" - }) - await page.waitFor(500); + // await program.screenshot({ + // path: "static/screenshot/ucenter.png" + // }) + const savePath = process.env.saveImageSnapshotDir + console.log('savePath',savePath) + await program.screenshot({ + path: savePath + }) }) })