Bird
Raised Fist0
Vueframework~8 mins

Component testing with Vue Test Utils - Performance & Optimization

Choose your learning style10 modes available
Performance: Component testing with Vue Test Utils
LOW IMPACT
Component testing affects development speed and feedback loop but can indirectly impact runtime performance by catching inefficient rendering patterns early.
Testing a Vue component's rendering and behavior
Vue
import { mount } from '@vue/test-utils'
import MyComponent from './MyComponent.vue'

test('renders with final prop value only', async () => {
  const wrapper = mount(MyComponent)
  await wrapper.setProps({ count: 99 })
  expect(wrapper.text()).toContain('99')
})
Only one prop update triggers a single re-render, making the test faster and more efficient.
📈 Performance Gainsingle re-render, test runs 5x faster
Testing a Vue component's rendering and behavior
Vue
import { mount } from '@vue/test-utils'
import MyComponent from './MyComponent.vue'

test('renders and updates DOM repeatedly', async () => {
  const wrapper = mount(MyComponent)
  for(let i = 0; i < 100; i++) {
    await wrapper.setProps({ count: i })
  }
  expect(wrapper.text()).toContain('99')
})
This test triggers 100 re-renders and DOM updates, slowing test execution and wasting CPU.
📉 Performance Costblocks test runner for 200+ ms due to repeated re-renders
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Multiple prop updates in loopMany DOM patches100 reflowsHigh paint cost[X] Bad
Single prop update before assertionOne DOM patch1 reflowLow paint cost[OK] Good
Rendering Pipeline
Vue Test Utils mounts components in a virtual DOM environment. Each prop or state change triggers Vue's reactive system to recalculate and patch the DOM, causing reflows and repaints in the test environment.
→Virtual DOM patching
→Reactive updates
→DOM reflow
→Paint
⚠️ BottleneckExcessive reactive updates causing multiple reflows and repaints
Optimization Tips
1Avoid multiple prop or state updates in a single test to reduce re-renders.
2Batch updates and assert after final state to speed up tests.
3Use the Performance panel to detect unnecessary DOM updates during testing.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance cost of updating component props multiple times in a test?
AIncreased bundle size
BSlower network requests
CMultiple re-renders and DOM updates slowing test execution
DMore CSS recalculations
DevTools: Performance
How to check: Run tests with Vue Test Utils and open the browser's Performance panel. Record while tests run to see how many re-renders and layout recalculations occur.
What to look for: Look for multiple layout recalculations and long scripting times indicating excessive DOM updates during tests.

Practice

(1/5)
1. What is the primary purpose of using mount() from Vue Test Utils in component testing?
easy
A. To compile Vue components into production code
B. To deploy Vue components to a server
C. To style Vue components with CSS
D. To create a full instance of a Vue component for testing its behavior

Solution

  1. Step 1: Understand the role of mount()

    mount() creates a real instance of a Vue component in a test environment.

  2. Step 2: Identify what mount() is NOT for

    It is not used for compiling, styling, or deploying components.

  3. Final Answer:

    To create a full instance of a Vue component for testing its behavior -> Option D
  4. Quick Check:

    mount() creates component instance [OK]
Hint: Remember: mount() means create component instance [OK]
Common Mistakes:
  • Confusing mount() with build or deploy tools
  • Thinking mount() styles components
  • Assuming mount() compiles code
2. Which of the following is the correct way to import mount from Vue Test Utils in a test file?
easy
A. import { mount } from '@vue/test-utils';
B. import mount from 'vue-test-utils';
C. const mount = require('vue-test-utils');
D. import { mount } from 'vue';

Solution

  1. Step 1: Check the official import syntax

    The correct import uses named import from '@vue/test-utils'.

  2. Step 2: Identify incorrect import styles

    import mount from 'vue-test-utils'; uses default import incorrectly, C uses CommonJS require which is outdated here, A imports from wrong package.

  3. Final Answer:

    import { mount } from '@vue/test-utils'; -> Option A
  4. Quick Check:

    Correct import syntax = import { mount } from '@vue/test-utils'; [OK]
Hint: Use named import from '@vue/test-utils' [OK]
Common Mistakes:
  • Using default import instead of named import
  • Using require() instead of import
  • Importing from wrong package
3. Given this test code snippet:
const wrapper = mount({ template: '{{ count }}', data() { return { count: 0 } } });
await wrapper.find('button').trigger('click');
console.log(wrapper.text());

What will be logged to the console?
medium
A. 0
B. click
C. 1
D. undefined

Solution

  1. Step 1: Understand the component behavior

    The button shows the current count, starting at 0, and increments count on click.
  2. Step 2: Analyze the test actions

    The test triggers a click event on the button, increasing count from 0 to 1, then logs the button text.
  3. Final Answer:

    1 -> Option C
  4. Quick Check:

    Click increments count, text shows 1 [OK]
Hint: Click triggers count++ so text updates to 1 [OK]
Common Mistakes:
  • Assuming text stays 0 after click
  • Confusing event name with text output
  • Forgetting to await trigger for update
4. What is wrong with this test code snippet?
const wrapper = mount(MyComponent);
wrapper.find('button').trigger('click');
expect(wrapper.text()).toContain('Clicked');
medium
A. Missing await before trigger to wait for DOM update
B. Incorrect selector used in find()
C. Missing import of mount from Vue Test Utils
D. Using expect() incorrectly without a matcher

Solution

  1. Step 1: Identify asynchronous DOM update

    Triggering events may update DOM asynchronously, so awaiting trigger is needed.
  2. Step 2: Check the code for await usage

    The code calls trigger() without await, so the expect() runs before DOM updates.
  3. Final Answer:

    Missing await before trigger to wait for DOM update -> Option A
  4. Quick Check:

    Await trigger() for DOM update [OK]
Hint: Always await trigger() to ensure DOM updates before assertions [OK]
Common Mistakes:
  • Not awaiting trigger causing test to fail
  • Assuming find() selector is wrong without checking
  • Forgetting to import mount (not shown here)
  • Misusing expect() matcher syntax
5. You want to test a component that emits a custom event submit with a payload object when a form is submitted. Which Vue Test Utils method correctly checks the event and its payload?
hard
A. expect(wrapper.find('form').trigger('submit')).toBeTruthy();
B. expect(wrapper.emitted().submit[0]).toEqual([{ name: 'John' }]);
C. expect(wrapper.text()).toContain('submit');
D. expect(wrapper.props().submit).toBeDefined();

Solution

  1. Step 1: Understand event emission checking

    Vue Test Utils stores emitted events in wrapper.emitted(), accessible by event name and call index.
  2. Step 2: Verify correct assertion for event payload

    expect(wrapper.emitted().submit[0]).toEqual([{ name: 'John' }]); checks the first submit event payload matches the expected object, which is correct.
  3. Final Answer:

    expect(wrapper.emitted().submit[0]).toEqual([{ name: 'John' }]); -> Option B
  4. Quick Check:

    Use emitted() to check event and payload [OK]
Hint: Use wrapper.emitted() to check events and payloads [OK]
Common Mistakes:
  • Checking text instead of emitted events
  • Testing props instead of events
  • Not accessing emitted event payload array
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard