diff --git a/contributor_docs/unit_testing.md b/contributor_docs/unit_testing.md index 64ef0f73b9..072ba65705 100644 --- a/contributor_docs/unit_testing.md +++ b/contributor_docs/unit_testing.md @@ -139,3 +139,29 @@ If you need to add a new test file, add it to that folder, then add the filename When you add a new test, running `npm test` will generate new screenshots for any visual tests that do not yet have them. Those screenshots will then be used as a reference the next time tests run to make sure the sketch looks the same. If a test intentionally needs to look different, you can delete the folder matching the test name in the `test/unit/visual/screenshots` folder, and then re-run `npm test` to generate a new one. To manually inspect all visual tests, run `grunt yui:dev` to launch a local server, then go to http://127.0.0.1:9001/test/visual.html to see a list of all test cases. + + +In a continuous integration (CI) environment, optimizing test speed is essential. It is advantageous to keep the code concise, avoid unnecessary frames, minimize canvas size, and load assets only when essential for the specific functionality under test. +To address scenarios involving operations like asynchronous 3D model rendering, consider returning a promise that resolves upon completing all the necessary tests, ensuring efficiency in your visual testing approach. Here's an example of how you can asynchronous 3D model rendering in your visual tests: + +```js +visualSuite('3D Model rendering', function() { + visualTest('OBJ model is displayed correctly', function(p5, screenshot) { + // Return a Promise to ensure the test runner waits for the asynchronous operation to complete + return new Promise(resolve => { + p5.createCanvas(50, 50, p5.WEBGL); + // Load the model asynchronously + p5.loadModel('unit/assets/teapot.obj', model => { + p5.background(200); + p5.rotateX(10 * 0.01); + p5.rotateY(10 * 0.01); + p5.model(model); + // Take a screenshot for visual comparison + screenshot(); + // Resolve the Promise to indicate completion + resolve(); + }); + }); + }); +}); +``` diff --git a/test/unit/visual/visualTest.js b/test/unit/visual/visualTest.js index 24dbec2f53..ec66fc3e07 100644 --- a/test/unit/visual/visualTest.js +++ b/test/unit/visual/visualTest.js @@ -151,6 +151,10 @@ window.visualTest = function( actual.push(myp5.get()); }); + + if (actual.length === 0) { + throw new Error('No screenshots were generated. Check if your test generates screenshots correctly. If the test includes asynchronous operations, ensure they complete before the test ends.'); + } if (expectedScreenshots && actual.length !== expectedScreenshots) { throw new Error( `Expected ${expectedScreenshots} screenshot(s) but generated ${actual.length}`