diff --git a/jest-setup.js b/jest-setup.js index 624cfa0d392a3f0fe7e19e5b5c254c1b9ee2d484..1f7ad9b592c0c62a3f641a50d9ffde922e9d801d 100644 --- a/jest-setup.js +++ b/jest-setup.js @@ -1,26 +1,149 @@ -// 自动化测试 -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}__` -let environment = 'official' -if(hbuilderx_version.includes('dev')){ - environment = 'dev' -}else if(hbuilderx_version.includes('alpha')){ - environment = 'alpha' -} -const baseFolderName = `__image_snapshots__/base/${environment}/__${uniTestPlatformInfo}__` +const path = require("path"); +const fs = require("fs"); + +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}__`; +let environment = "official"; +if (hbuilderx_version.includes("dev")) { + environment = "dev"; +} else if (hbuilderx_version.includes("alpha")) { + environment = "alpha"; +} +const baseFolderName = `__image_snapshots__/base/${environment}/__${uniTestPlatformInfo}__`; expect.extend({ - toMatchImageSnapshot: configureToMatchImageSnapshot({ - customSnapshotIdentifier(args) { - return args.currentTestName.replace(/\//g, '-').replace(' ', '-'); - }, - customSnapshotsDir: path.join(__dirname, baseFolderName), - customDiffDir: path.join(__dirname, `${folderName}/`, 'diff'), - }), + toMatchImageSnapshot: configureToMatchImageSnapshot({ + customSnapshotIdentifier(args) { + return args.currentTestName.replace(/\//g, "-").replace(" ", "-"); + }, + customSnapshotsDir: path.join(__dirname, baseFolderName), + customDiffDir: path.join(__dirname, `${folderName}/`, "diff"), + }), + toSaveSnapshot, + toSaveImageSnapshot, }); + +function toSaveSnapshot(received, { customSnapshotsDir, fileName } = {}) { + const { 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(snapshotDir); + fs.writeFileSync(filePath, received); + } catch (e) { + console.log("toSaveSnapshot fail", e); + message = () => e.message; + pass = false; + } + + return { + message, + pass, + }; +} + +function toSaveImageSnapshot( + received, + { customSnapshotsDir, customSnapshotIdentifier } = {} +) { + const { testPath, currentTestName } = this; + const SNAPSHOTS_DIR = "__image_snapshots__"; + const snapshotDir = + process.env.saveImageSnapshotDir || + createSnapshotDir({ + customSnapshotsDir, + testPath, + SNAPSHOTS_DIR, + }); + const _fileName = createFileName({ + fileName: customSnapshotIdentifier ? customSnapshotIdentifier() : "", + testPath, + currentTestName, + fileType: "png", + }); + const filePath = path.join(snapshotDir, _fileName); + let message = () => `${currentTestName} toSaveImageSnapshot success`; + let pass = true; + + try { + checkSnapshotDir(snapshotDir); + fs.writeFileSync(filePath, Buffer.from(received, "base64")); + } 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/toSaveSnapshot-toSaveImageSnapshot-template.test.js b/pages/toSaveSnapshot-toSaveImageSnapshot-template.test.js new file mode 100644 index 0000000000000000000000000000000000000000..a7beb54315ce6486c9e65cace95d54a6757ba917 --- /dev/null +++ b/pages/toSaveSnapshot-toSaveImageSnapshot-template.test.js @@ -0,0 +1,60 @@ +describe('toSaveSnapshot & toSaveImageSnapshot template', () => { + beforeAll(async () => { + let page = await program.reLaunch('/pages/tabBar/component'); + await page.waitFor(1000); + }) + + it('test toSaveSnapshot 1', async () => { + const text1 = 'test-toSaveSnapshot-1-1-' + Date.now() + expect(text1).toSaveSnapshot() + const text2 = 'test-toSaveSnapshot-1-2-' + Date.now() + expect(text2).toSaveSnapshot() + }) + + it('test toSaveSnapshot 2', async () => { + const text1 = 'test-toSaveSnapshot-2-1-' + Date.now() + expect(text1).toSaveSnapshot({ + customSnapshotsDir: `./customDir/__file_snapshots__`, + fileName: 'test-toSaveSnapshot-2-1.txt' + }) + const text2 = 'test-toSaveSnapshot-2-2-' + Date.now() + expect(text2).toSaveSnapshot({ + customSnapshotsDir: './customDir/__file_snapshots__' + }) + + const text3 = 'test-toSaveSnapshot-2-3-' + Date.now() + expect(text3).toSaveSnapshot({ + fileName: 'test-toSaveSnapshot-2-3.txt' + }) + }) + + it('test toSaveImageSnapshot 1', async () => { + const img1 = await program.screenshot(); + expect(img1).toSaveImageSnapshot() + + const img2 = await program.screenshot(); + expect(img2).toSaveImageSnapshot() + }) + + it('test toSaveImageSnapshot 2', async () => { + const img1 = await program.screenshot(); + expect(img1).toSaveImageSnapshot({ + customSnapshotsDir: './customDir/__image_snapshots__', + customSnapshotIdentifier() { + return 'test-toSaveImageSnapshot-2-1.png'; + }, + }) + + const img2 = await program.screenshot(); + expect(img2).toSaveImageSnapshot({ + customSnapshotsDir: './customDir/__image_snapshots__', + }) + + const img3 = await program.screenshot(); + expect(img3).toSaveImageSnapshot({ + customSnapshotIdentifier() { + return 'test-toSaveImageSnapshot-2-3.png'; + }, + }) + }) +}); \ No newline at end of file