Bun: Is it fast for test automation?

Bun: Is it fast for test automation?

What is Bun?

From the official site - Bun is a fast JavaScript all-in-one toolkit/bundler/runtime/package-manager/test runner.

Bun - it’s similar to node.js and Deno - both of them are JavaScript runtimes.

Deno also can support typescript out-of-box and the compilation step is not required.

Environment information

I use a MacBook Pro 14-inch, 2023.

NameDescription
ChipApple M2 Pro
Memory16 GB
OS14.0 Beta (23A5337a)
npm9.6.7
yarn1.22.19
pnpm8.7.0
node.jsv18.17.1
bun1

How to install Bun

From the Official site:

curl -fsSL https://bun.sh/install | bash

Test

Disclaimer: I cannot test bun on the current project, since we use unimplemented bun node: API. When bun will fully compatable with node.js - I will retest on the real project.

The test is simple. We will run both headless and headful modes

Video 1. Repesentation of headless mode.

Project structure will be looks like this:

- src
  - **demo.test.ts** - our scenario to test
- package.json
- **playwright.config.ts** - playwright configuration

Round 1. Headful mode

playwright Configuration will be looks like this:

mport { defineConfig, devices } from "@playwright/test";

export default defineConfig({
  // Look for test files in the "tests" directory, relative to this configuration file.
  testDir: "tests",
  workers: 1,
  use: {
    // Base URL to use in actions like `await page.goto('/')`.
    baseURL: "https://google.com",
    launchOptions: {
      // headful mode
      headless: false,
    },
  },
  // Configure projects for major browsers.
  projects: [
    {
      name: "chromium",
      use: { ...devices["Desktop Chrome"] },
    },
  ],
});

And the text:

import { test, expect } from "@playwright/test";

test("should work", async ({ page }) => {
  // opens baseURL
  await page.goto("/");
});

Let’s see some results:

Launch #Bunpnpmyarnnpm
12.62.872.772.75
22.52.722.712.66
32.452.772.682.64
42.513.052.772.67
Median
N/A2.52.822.7352.665
Difference
N/A012%9.4%6.6%

Table 1. Bun vs. pnpm vs yarn vs npm. Headful mode. Time in seconds

Very impressive. Bun is about 12% faster than pnpm in execution time. Npm is a second after bun! 🤯

Round 2. Headless mode

The same test file, but let’s update the configuration in playwright.config.ts the file.

import { defineConfig, devices } from "@playwright/test";

export default defineConfig({
  // Look for test files in the "tests" directory, relative to this configuration file.
  testDir: "tests",
  workers: 1,
  use: {
    // Base URL to use in actions like `await page.goto('/')`.
    baseURL: "https://google.com",
    launchOptions: {
      // headless mode
      headless: true,
    },
  },
  // Configure projects for major browsers.
  projects: [
    {
      name: "chromium",
      use: { ...devices["Desktop Chrome"] },
    },
  ],
});
Launch #Bunpnpmyarnnpm
11.972.162.072.17
21.972.242.322.1
31.972.202.062.17
42.022.222.192.14
Median
N/A1.972.212.132.15
Difference
N/A012%8%9%

Table 2. Bun vs. pnpm vs yarn vs npm. Headless mode. Time in seconds

The difference between executions for pnpm and bun is about 12%! pnpm is the slowest!

Conclusion

It was impressive! Bun is 12% faster than pnpm; 9% faster than yarn and 8% faster than npm

NOTE 1: I cannot test bun on the current project, since we use unimplemented bun node: API. When the bun is fully compatible with node.js - I will retest on the real project.

Observation 1: NPM is a second after bun by execution time. It blows my mind! 🤯

Observation 2: PNPM is the slowest package manager by execution time. Nevertheless, I still like it because of the installation and lock-resolving time.

I think that Bun is preferable to Deno! Why? Deno starts its own ecosystem without node.js compatibility and it has have own package system (as URL importing instead of local package name). URL import notation can confuse developers and it always to be remember package URL.

Bunbye!