We have a mix of `type` and `interface` usage throughout our codebase, that is sometimes difficult to follow and reason about. We should follow the suggestion from the TypeScript PM and use `interface` consistently where possible. This leads to better type display in errors and makes our codebase easier to read (b/c consistency). This CL adds the `@typescript-eslint/consistent-type-definitions` ESLint rule to accomplish this. Fixed: 387237537 Change-Id: Idb9e8275ddd8f633021d6cf1c933e2e55f980e45 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6152576 Auto-Submit: Nikolay Vitkov <nvitkov@chromium.org> Commit-Queue: Benedikt Meurer <bmeurer@chromium.org> Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
Interaction Testing
Interaction tests are used to test individual pieces of DevTools in isolation - whether that be a single UI component, or an entire panel, or something inbetween. They load up the page in the browser and use Puppeteer to query it.
Interaction tests are run against examples on the Components Server, so your first step to writing an Interaction test is to create the required examples you want to test against.
When writing an interactions test, you should use the loadComponentDocExample() helper to instruct the test to navigate to a particular example within the component server.
describe('Example test', () => {
it('does something', async () => {
await loadComponentDocExample('performance_panel/basic.html?trace=basic');
// Assertions go here
});
});
Screenshot tests
Ensure you are a member of the g/devtools-dev group, otherwise the
update_goldens_v2.pytool will not work.
Interaction tests also have the ability to store a screenshot of an element and in future tests ensure that the screenshot has not changed. These should be used sparingly - our usage so far has found that you should prefer HTML assertions if possible - but they are useful particularly for <canvas> based UI.
To create a screenshot test, query for an element and call the assertElementScreenshotUnchanged function, passing in the element and the file name:
itScreenshot('loads a trace file and renders it in the timeline', async () => {
await loadComponentDocExample('performance_panel/basic.html?trace=basic');
const flamechart = await waitFor('.timeline-flamechart');
await assertElementScreenshotUnchanged(flamechart, 'performance/example-test.png');
});
The first time this test runs, it will create a new stored image in test/interactions/goldens. On any future runs, it will compare the generated screenshot against that golden, and fail if there is a difference.
We store and assert golden screenshots from Linux. Mac and Windows are deliberately excluded as web content rarely changes has platform-specific bugs. Developers can update screenshots locally or use screenshots generated from the CQ bots (see below).
Updating screenshots locally
When you need to update a screenshot because you have purposefully changed the UI:
npm run test -- $TESTPATH --on-diff=update
This tells the test runner to update any screenshots that fail. Once you've done this, the process is identical to when you add a new screenshot:
- Commit the changes for your platform locally.
- Trigger a CQ run and wait for it to finish using
git cl try. - Fetch the new screenshots from the bots by using
./scripts/tools/update_goldens_v2.py.
Note that if you do this step on Linux, you shouldn't need to then get the updates from the bot, because the bots also test and run on Linux.
Generating and/or updating screenshots via CQ bots
Once you have generated your screenshot locally on your platform, you should upload your CL and trigger a dry-run. This will fail due to missing screenshots, but once it is complete we can then fetch the screenshots from the server.
First, authenticate (using your Google corp credentials):
# Run this in the devtools-frontend repository
./third_party/depot_tools/gsutil.py config
And then call the script to update the golden screenshots:
./scripts/tools/update_goldens_v2.py
This will fetch any relevant screenshots locally. You can then commit these and update your CL. Please manually check the screenshots to ensure they are as expected on all platforms!