CINXE.COM

bun testが速いのでvitestから置き換えたらめちゃ高速化された

<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/><meta content="width=device-width, initial-scale=1" name="viewport"/><title>bun testが速いのでvitestから置き換えたらめちゃ高速化された</title><link rel="canonical" href="https://zenn.dev/studio/articles/c5207260e90e8c"/><meta name="twitter:card" content="summary_large_image"/><meta property="og:url" content="https://zenn.dev/studio/articles/c5207260e90e8c"/><meta property="og:title" content="bun testが速いのでvitestから置き換えたらめちゃ高速化された"/><meta property="og:image" content="https://res.cloudinary.com/zenn/image/upload/s--3tX5vM0s--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:bun%2520test%25E3%2581%258C%25E9%2580%259F%25E3%2581%2584%25E3%2581%25AE%25E3%2581%25A7vitest%25E3%2581%258B%25E3%2582%2589%25E7%25BD%25AE%25E3%2581%258D%25E6%258F%259B%25E3%2581%2588%25E3%2581%259F%25E3%2582%2589%25E3%2582%2581%25E3%2581%25A1%25E3%2582%2583%25E9%25AB%2598%25E9%2580%259F%25E5%258C%2596%25E3%2581%2595%25E3%2582%258C%25E3%2581%259F%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_34:miyaoka%2Cx_220%2Cy_108/bo_3px_solid_rgb:d6e3ed%2Cg_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2UwYmNhNWZkODEuanBlZw==%2Cr_20%2Cw_90%2Cx_92%2Cy_102/co_rgb:6e7b85%2Cg_south_west%2Cl_text:notosansjp-medium.otf_30:Studio%2520Tech%2520Blog%2Cx_220%2Cy_160/bo_4px_solid_white%2Cg_south_west%2Ch_50%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2FlYTU4ZTc5ZDAuanBlZw==%2Cr_max%2Cw_50%2Cx_139%2Cy_84/v1627283836/default/og-base-w1200-v2.png"/><meta property="og:type" content="article"/><meta property="og:site_name" content="Zenn"/><meta content="https://storage.googleapis.com/zenn-user-upload/avatar/aea58e79d0.jpeg" name="zenn:image"/><meta content="miyaokaさんによる記事" name="zenn:description"/><meta name="next-head-count" content="12"/><script nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=">var theme = localStorage.getItem('theme') || 'light'; window.document.documentElement.dataset.theme = theme;</script><script nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=">var displayMode = 'browser'; if (window.matchMedia('(display-mode: standalone)').matches) { displayMode = 'standalone'; // PWA } else if (window.navigator.standalone === true) { displayMode = 'standalone'; // PWA on iOS Safari } window.dataLayer = window.dataLayer || []; window.dataLayer.push({'display_mode': displayMode});</script><script nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=">(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-K42DRM8');</script><script async="" src="https://www.googletagmanager.com/gtag/js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ="></script><script nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=">window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());</script><script src="https://embed.zenn.studio/js/listen-embed-event.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ="></script><style nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ="> @font-face { font-family: 'Inter'; font-weight: 600; font-display: swap; src: local(''), url('https://static.zenn.studio/fonts/inter-v3-latin-600.woff2') format('woff2'); } @font-face { font-family: 'Inter'; font-weight: 700; font-display: swap; src: local(''), url('https://static.zenn.studio/fonts/inter-v3-latin-700.woff2') format('woff2'); }</style><meta content="Zenn" name="apple-mobile-web-app-title"/><link href="/manifest.json" rel="manifest"/><link href="https://static.zenn.studio/images/logo-transparent.png" rel="shortcut icon" type="image/png"/><link href="https://static.zenn.studio/images/icon.png" rel="apple-touch-icon-precomposed" type="image/png"/><link nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" rel="preload" href="https://static.zenn.studio/_next/static/css/7a7d3ef1baef969e.css" as="style"/><link nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" rel="stylesheet" href="https://static.zenn.studio/_next/static/css/7a7d3ef1baef969e.css" data-n-g=""/><link nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" rel="preload" href="https://static.zenn.studio/_next/static/css/0b7fc73fb3e723d6.css" as="style"/><link nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" rel="stylesheet" href="https://static.zenn.studio/_next/static/css/0b7fc73fb3e723d6.css" data-n-p=""/><link nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" rel="preload" href="https://static.zenn.studio/_next/static/css/14917136769e9a98.css" as="style"/><link nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" rel="stylesheet" href="https://static.zenn.studio/_next/static/css/14917136769e9a98.css"/><noscript data-n-css="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ="></noscript><script defer="" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" nomodule="" src="https://static.zenn.studio/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script defer="" src="https://static.zenn.studio/_next/static/chunks/529.c059f195224c53d3.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ="></script><script src="https://static.zenn.studio/_next/static/chunks/webpack-e3d114ae7b916570.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/framework-6603b6fce1ea64cf.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/main-263cb6a7a7f1a583.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/pages/_app-5df8cb41e7c1b84b.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/5625-25fd02b61ddb8be0.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/327-4a46c0c9d0f704da.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/6594-b8a8c79be8e26450.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/4719-bc9a5a3c67c7f794.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/3517-92e9c90508c2fa71.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/8063-5a9ff40fcfd3ba25.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/chunks/pages/%5Busername%5D/articles/%5Bslug%5D-2ec99010cee5f56c.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/8XDX_1Wb7xPMW2Ir_tENg/_buildManifest.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script><script src="https://static.zenn.studio/_next/static/8XDX_1Wb7xPMW2Ir_tENg/_ssgManifest.js" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=" defer=""></script></head><body><script nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=">const shouldUseTwemoji = !/(googlebot|macintosh|macintel|macppc|mac68k|macos|iphone|ipad)/i.test(window.navigator.userAgent); if(shouldUseTwemoji) document.body.setAttribute("data-use-twemoji", "true");</script><div id="__next"><header class="AppHeader_header__54XdE"><div class="Container_wide__ykGLh Container_common__figYY"><div class="AppHeader_inner__CJC4C"><a class="ZennLogo_logoLink__NJS2l" href="/"><svg x="0px" y="0px" viewBox="0 0 377.4 88.3" aria-label="Zenn | エンジニアのための情報共有コミュニティ" class="ZennLogo_logoSvg__yOhcg" height="22"><title>Zenn</title><g fill="currentColor"><path d="M233,56.8h-39c0.5,3.5,2.2,6.8,4.8,9.2c2.7,2.3,6.2,3.5,9.8,3.4c2.8,0,5.6-0.5,8.2-1.7c2.5-1.1,4.8-2.8,6.5-5l8.2,9.5 c-2.5,3.4-5.7,6.1-9.5,7.9c-4.6,2.2-9.6,3.3-14.7,3.2c-5.7,0.1-11.4-1.2-16.5-4c-4.5-2.5-8.2-6.3-10.7-10.9s-3.8-9.8-3.7-15.1v-2.2 c-0.1-5.7,1.1-11.3,3.5-16.5c2.2-4.7,5.7-8.6,10.1-11.3c4.7-2.8,10.1-4.2,15.5-4.1c5.2-0.1,10.3,1.1,14.9,3.7 c4.1,2.5,7.4,6.2,9.4,10.5c2.2,5.1,3.3,10.5,3.2,16.1V56.8z M216.1,43.9c0.1-2.9-0.9-5.7-2.8-7.9c-1.8-1.9-4.4-2.9-7.9-2.9 c-2.9-0.1-5.8,1.1-7.7,3.2c-2,2.6-3.3,5.7-3.6,9h22V43.9z"></path><path d="M128.3,67.9h36.1v14.7h-56.9V72l35.8-54.3h-36.2V2.9h56.6v10.4L128.3,67.9z"></path><path d="M248.8,50.7c0-19.1,12.7-29.2,28.2-29.2s27.9,10.1,27.9,29.2V82h-16V51.4c0-10.6-4.8-16.1-12-16.1s-12.4,5.5-12.4,16.1 v30.7h-15.8L248.8,50.7L248.8,50.7z"></path><path d="M320.3,50.7c0-19.1,12.7-29.2,28.2-29.2s27.9,10.1,27.9,29.2V82h-16V51.4c0-10.6-4.8-16.1-12-16.1S336,40.8,336,51.4v30.7 h-15.8L320.3,50.7L320.3,50.7z"></path></g><path fill="#3EA8FF" class="st0" d="M2.4,83.3h17c0.9,0,1.7-0.5,2.2-1.2L68.4,5.2C69,4.2,68.3,3,67.1,3H51c-0.8,0-1.5,0.4-1.9,1.1L1.6,81.9 C1.3,82.5,1.7,83.3,2.4,83.3z"></path><path fill="#3EA8FF" class="st0" d="M61,82.1l22.1-35.5c0.7-1.1-0.1-2.5-1.4-2.5H65.7c-0.6,0-1.2,0.3-1.5,0.8L41.5,81.2c-0.6,0.9,0.1,2.1,1.2,2.1 h16.3C59.8,83.3,60.6,82.9,61,82.1z"></path></svg></a></div></div></header><article class="View_container__VQuzA"><aside class="ContentStickyNavForMobile_container__153a8"><div class="Container_wide__ykGLh Container_common__figYY"><div class="ContentStickyNavForMobile_inner__xJ_fS"><div class="ContentStickyNavForMobile_avatarInner__3_noS"><a class="ContentStickyNavForMobile_principalLink__c15vw" href="/p/studio"><span class="ContentStickyNavForMobile_avatarContainer__V3P_G"><img alt="Studio Tech Blog" class="AvatarImage_border__pDIjF AvatarImage_plain__Fgp4R AvatarImage_withPublication__hNtIe" height="38" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/e0bca5fd81.jpeg" width="38"/></span><span class="ContentStickyNavForMobile_displayName__cmEag">Studio Tech Blog</span></a></div><div class="ContentStickyNavForMobile_actions__a9fMk"></div></div></div></aside><div class="PublicationInfoForDesktop_container__UxKig"><div class="Container_wide__ykGLh Container_common__figYY"><div class="PublicationInfoForDesktop_inner__LnToC"><a class="PublicationInfoForDesktop_link__fqxgJ" href="/p/studio"><span class="PublicationInfoForDesktop_avatar__qh_yu"><img alt="" class="AvatarImage_border__pDIjF AvatarImage_plain__Fgp4R AvatarImage_withPublication__hNtIe" height="45" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/e0bca5fd81.jpeg" width="45"/></span><span class="PublicationInfoForDesktop_displayName__nzipD">Studio Tech Blog</span></a><span class="PublicationInfoForDesktop_label__d4mY3"><a class="PublicationLabelLink_link__JBqs2" href="/faq#what-is-publication">Publicationへの投稿</a></span></div></div></div><header class="ArticleHeader_header__IRbtk"><div class="Container_wide__ykGLh Container_common__figYY"><div class="ArticleHeader_main__W98WY"><div class="ArticleHeader_emoji__30JiU"><span class="Emoji_twemoji__hcxYF"><span class="Emoji_twemojiImg__Oc6vR" style="background-image:url(https://asia-northeast1-zenn-dev-production.cloudfunctions.net/twemoji/⚡.svg)"></span></span><span class="Emoji_nativeEmoji__GMBzX">⚡</span></div><h1 class="ArticleHeader_title__9jiOv"><span style="font-size:0.856em">bun testが速いのでvitestから置き換えたらめちゃ高速化された</span></h1><div class="ArticleHeader_metaContainer__5UzrJ"><div class="ArticleHeader_metaInfo__XrRdh"><div class="ArticleHeader_userInfo__g_sSW"><a class="ArticleHeader_avatar__anCEE" href="/miyaoka"><img alt="" class="AvatarImage_plain__Fgp4R " height="25" loading="lazy" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/aea58e79d0.jpeg" width="25"/></a><a class="ArticleHeader_metaUserName__FbZgW" href="/miyaoka">miyaoka</a></div><span class="ArticleHeader_pubDate__gF_sc"><span class="ArticleHeader_num__7Zpz0">2024/12/17</span>に公開</span></div></div></div></div></header><div class="Container_wide__ykGLh Container_common__figYY"><div class="ContainerUndo_undoInSM__1vdc1"><div class="View_inner__LlCJG"><div class="View_stickyShare__TsaVf"><div class="View_stickyShareInner__FLu2S"><div class="LikeButton_container__YlckE style-large-white count-bottom"><button aria-label="いいね" class="LikeButton_button__ZwdG4"><svg class="LikeButton_svgLike__Gl0Sz" viewBox="0 0 110 110"><path class="LikeButton_svgLikeLine__f9txR" d="M73,24a23.78,23.78,0,0,0-15.89,6.19,3.14,3.14,0,0,1-4.18,0A23.81,23.81,0,0,0,37,24a22,22,0,0,0-22,22c0,16.67,19.64,32.82,25.11,37.93,2.84,2.65,6.15,5.64,8.92,8.13a8.9,8.9,0,0,0,11.9,0c2.77-2.49,6.07-5.48,8.91-8.13C75.37,78.81,95,62.66,95,46A22,22,0,0,0,73,24Z" fill="currentColor"></path><path class="LikeButton_svgLikeInner__uiexS" d="M66.25,76.42c-.71.64-1.32,1.2-1.82,1.67-2.51,2.33-5.39,5-7.94,7.25a2.21,2.21,0,0,1-3,0C51,83,48.1,80.42,45.59,78.09c-.5-.47-1.12-1-1.82-1.67C38.09,71.29,23,57.67,23,46A14,14,0,0,1,37,32a15.92,15.92,0,0,1,11.65,5.23l4.73,5a2.2,2.2,0,0,0,3.23,0l4.72-5A16.06,16.06,0,0,1,73,32,14,14,0,0,1,87,46C87,57.67,71.93,71.29,66.25,76.42Z" fill="currentColor"></path><g class="LikeButton_svgLikeDecoration__78UjB"><circle cx="41.5" cy="9.5" fill="#3ea8ff" r="3.5"></circle><circle cx="98.5" cy="26.5" fill="#ffdc6e" r="3.5"></circle><circle cx="13" cy="19" fill="#c067f4" r="5"></circle><circle cx="77" cy="9" fill="#f76685" r="5"></circle><circle cx="26.5" cy="92.5" fill="#f76685" r="3.5"></circle><circle cx="105.5" cy="48.5" fill="#c067f4" r="3.5"></circle><circle cx="4.5" cy="60.5" fill="#3ea8ff" r="3.5"></circle><circle cx="94.5" cy="73.5" fill="#3ea8ff" r="1.5"></circle><circle cx="16.5" cy="75.5" fill="#ffdc6e" r="1.5"></circle><circle cx="78.5" cy="91.5" fill="#ffdc6e" r="1.5"></circle></g></svg></button></div><span style="display:block;height:1rem;flex-shrink:0"></span><span style="display:block;height:1rem;flex-shrink:0"></span><div class="ShareButtonsExperimental_container__CrtBj" style="flex-direction:column;align-items:stretch"><a aria-label="X(Twitter)にポスト" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgTwitterVertical__NmmfB ShareButtonsExperimental_svgTwitterBase__8FrNq" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://twitter.com/intent/tweet?url=https://zenn.dev/studio/articles/c5207260e90e8c&amp;text=bun%20test%E3%81%8C%E9%80%9F%E3%81%84%E3%81%AE%E3%81%A7vitest%E3%81%8B%E3%82%89%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E3%82%89%E3%82%81%E3%81%A1%E3%82%83%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%EF%BD%9Cmiyaoka&amp;hashtags=zenn" id="gtm-article-left-tweet" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="27" height="28" viewBox="0 0 27 28" fill="none"><g clip-path="url(#clip0_1_18)"><path d="M16.0687 11.7356L26.12 0H23.7382L15.0106 10.1899L8.03988 0H0L10.5411 15.4089L0 27.7155H2.38199L11.5985 16.9546L18.9601 27.7155H27L16.0681 11.7356H16.0687ZM12.8062 15.5447L11.7382 14.0103L3.24025 1.80106H6.89884L13.7568 11.6543L14.8248 13.1887L23.7393 25.9963H20.0807L12.8062 15.5452V15.5447Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1_18"><rect width="27" height="27.7297" fill="white"></rect></clipPath></defs></svg></a><a aria-label="Facebookに投稿" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgFacebookVertical__3ykb7 ShareButtonsExperimental_svgFacebookBase___gDOW" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="http://www.facebook.com/sharer.php?u=https://zenn.dev/studio/articles/c5207260e90e8c" id="gtm-article-left-facebook" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="28" height="29" viewBox="0 0 28 29" fill="none"><g clip-path="url(#clip0_2_21)"><path d="M28 14.7812C28 7.02084 21.7319 0.729736 14 0.729736C6.26808 0.729736 0 7.02084 0 14.7812C0 21.3707 4.52032 26.9002 10.6182 28.4189V19.0753H7.73136V14.7812H10.6182V12.9309C10.6182 8.14833 12.7747 5.93158 17.453 5.93158C18.34 5.93158 19.8705 6.10637 20.4966 6.28061V10.1729C20.1662 10.138 19.5922 10.1206 18.8793 10.1206C16.5838 10.1206 15.6968 10.9935 15.6968 13.2625V14.7812H20.2698L19.4841 19.0753H15.6968V28.7297C22.629 27.8895 28.0006 21.9654 28.0006 14.7812H28Z" fill="currentColor"></path></g><defs><clipPath id="clip0_2_21"><rect width="28" height="28" fill="white" transform="translate(0 0.729736)"></rect></clipPath></defs></svg></a><a aria-label="はてなブックマークに登録" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgHatenaBookmarkVertical__b161J ShareButtonsExperimental_svgHatenaBookmarkBase__VXz6p" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://b.hatena.ne.jp/add?mode=confirm&amp;url=https://zenn.dev/studio/articles/c5207260e90e8c&amp;title=bun%20test%E3%81%8C%E9%80%9F%E3%81%84%E3%81%AE%E3%81%A7vitest%E3%81%8B%E3%82%89%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E3%82%89%E3%82%81%E3%81%A1%E3%82%83%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%EF%BD%9Cmiyaoka" id="gtm-article-left-hatena-bookmark" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="27" height="28" viewBox="0 0 27 28" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.4999 0.729736H21.5001C24.5376 0.729736 27 3.19213 27 6.22964V22.2298C27 25.2673 24.5376 27.7297 21.5001 27.7297H5.4999C2.46239 27.7297 0 25.2673 0 22.2298V6.22964C0 3.19213 2.46239 0.729736 5.4999 0.729736ZM12.98 13.7472C13.8521 13.8136 14.5319 14.1209 15.0212 14.6673V14.6679C15.512 15.2127 15.7572 15.9444 15.7572 16.8543C15.7572 17.5126 15.62 18.0877 15.3436 18.5867C15.0692 19.084 14.6756 19.4712 14.1604 19.7433C13.7441 19.9658 13.2289 20.1278 12.6155 20.2245C12.001 20.3179 10.9966 20.3665 9.6039 20.3665H6.13656V8.09392H9.50184C10.8859 8.09392 11.8503 8.13875 12.4016 8.22623C12.9503 8.31695 13.4206 8.4703 13.8164 8.68792C14.269 8.93902 14.6129 9.27437 14.8527 9.69341C15.0865 10.1151 15.2069 10.6028 15.2069 11.1546C15.2069 11.8512 15.0309 12.4053 14.6761 12.813C14.3197 13.2261 13.756 13.5355 12.98 13.7472ZM9.96192 10.8144H9.24372H9.24318V13.2768H9.91116C10.7352 13.2768 11.2984 13.1856 11.6073 13.0058C11.9124 12.8227 12.0663 12.5273 12.0663 12.0667C12.0663 11.6061 11.9216 11.2821 11.6375 11.0947C11.3497 10.9084 10.7919 10.8144 9.96192 10.8144ZM10.4128 18.1514C11.2028 18.1514 11.7661 18.0531 12.0928 17.8523V17.8528C12.4227 17.653 12.5863 17.3209 12.5863 16.8581C12.5863 16.3408 12.4367 15.9806 12.1338 15.7765C11.8357 15.5724 11.2747 15.4703 10.463 15.4703H9.24372V18.1514H10.4128ZM19.3093 17.257C18.4502 17.257 17.7547 17.9525 17.7547 18.8111C17.7547 19.6697 18.4507 20.3658 19.3093 20.3658C20.1679 20.3658 20.8634 19.6697 20.8634 18.8111C20.8634 17.9525 20.1668 17.257 19.3093 17.257ZM17.9593 8.09318H20.6593V16.2753H17.9593V8.09318Z" fill="currentColor"></path></svg></a></div></div></div><div class="View_columnsContainer__ijfFN"><section class="View_content__OZ_Dc"><div class="View_main__AU6KW"><div class="Container_default__13H8g Container_common__figYY"><div class="View_topics__2sHkl"><a class="View_topicLink__jdtX_" href="/topics/test"><div class="View_topicImage__qMmmw"><img class="View_topicImg__TpkV5" loading="lazy" src="https://storage.googleapis.com/zenn-user-upload/topics/902109da93.jpeg"/></div><div class="View_topicName____nYp">Test</div></a><a class="View_topicLink__jdtX_" href="/topics/bun"><div class="View_topicImage__qMmmw"><img class="View_topicImg__TpkV5" loading="lazy" src="https://storage.googleapis.com/zenn-user-upload/topics/01fdf43e63.png"/></div><div class="View_topicName____nYp">Bun</div></a><a class="View_topicLink__jdtX_" href="/topics/vitest"><div class="View_topicImage__qMmmw"><img class="View_topicImg__TpkV5" loading="lazy" src="https://storage.googleapis.com/zenn-user-upload/topics/d00dc48de6.png"/></div><div class="View_topicName____nYp">Vitest</div></a><a class="View_topicLink__jdtX_" href="/tech-or-idea"><div class="View_topicImage__qMmmw"><img class="View_topicImg__TpkV5" loading="lazy" src="https://static.zenn.studio/images/drawing/tech-icon.svg"/></div><div class="View_topicName____nYp" style="text-transform:capitalize">tech</div></a></div><div class="InsertButtonToCodeBlock_insertButtonWrapper__ueql2"><div class="znc BodyContent_anchorToHeadings__uGxNv"><h2 id="%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91" data-line="0" class="code-line"> <a class="header-anchor-link" href="#%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91" aria-hidden="true"></a> きっかけ</h2> <ul data-line="2" class="code-line"> <li data-line="2" class="code-line">ユニットテストはvitestを使ってます</li> <li data-line="3" class="code-line">まあ十分速い</li> <li data-line="4" class="code-line">でもCIで全testを回すとけっこう時間がかかる</li> <li data-line="5" class="code-line">bunのtestが速いらしい。置き換えよう</li> </ul> <h2 id="%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E7%B5%90%E6%9E%9C" data-line="7" class="code-line"> <a class="header-anchor-link" href="#%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E7%B5%90%E6%9E%9C" aria-hidden="true"></a> 置き換えた結果</h2> <h3 id="before-(vitest)" data-line="9" class="code-line"> <a class="header-anchor-link" href="#before-(vitest)" aria-hidden="true"></a> before (vitest)</h3> <p data-line="11" class="code-line"><img src="https://storage.googleapis.com/zenn-user-upload/1eca99ff375c-20241217.png" loading="lazy" class="md-img"></p> <ul data-line="13" class="code-line"> <li data-line="13" class="code-line">1000弱のtestを回すのに2分44秒かかってた</li> </ul> <h3 id="after-(bun-%2B-vitest)" data-line="15" class="code-line"> <a class="header-anchor-link" href="#after-(bun-%2B-vitest)" aria-hidden="true"></a> after (bun + vitest)</h3> <p data-line="17" class="code-line"><img src="https://storage.googleapis.com/zenn-user-upload/b14158ecb628-20241217.png" loading="lazy" class="md-img"></p> <ul data-line="19" class="code-line"> <li data-line="19" class="code-line">9割方のtestをbunで実行して2秒。速すぎる</li> </ul> <p data-line="21" class="code-line"><img src="https://storage.googleapis.com/zenn-user-upload/72c9d3334d87-20241217.png" loading="lazy" class="md-img"></p> <ul data-line="23" class="code-line"> <li data-line="23" class="code-line">bunに移行が難しかった一部だけvitestで実行して7秒</li> </ul> <h2 id="bun%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%AA%E3%81%AE%EF%BC%9F" data-line="25" class="code-line"> <a class="header-anchor-link" href="#bun%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%AA%E3%81%AE%EF%BC%9F" aria-hidden="true"></a> bunってどうなの?</h2> <p data-line="27" class="code-line"><span class="embed-block zenn-embedded zenn-embedded-card"><iframe id="zenn-embedded__c62de34749669" src="https://embed.zenn.studio/card#zenn-embedded__c62de34749669" data-content="https%3A%2F%2Fbun.sh%2F" frameborder="0" scrolling="no" loading="lazy"></iframe></span><a href="https://bun.sh/" style="display:none" target="_blank" rel="nofollow noopener noreferrer">https://bun.sh/</a></p> <ul data-line="29" class="code-line"> <li data-line="29" class="code-line">どうなんですかね?</li> <li data-line="30" class="code-line"> <a href="https://2024.stateofjs.com/en-US/libraries/testing/" target="_blank" rel="nofollow noopener noreferrer">State of JavaScript 2024: Testing</a> によればother testing toolsの中では3位でした</li> <li data-line="31" class="code-line"> <code>Develop, test, run, and bundle</code> ができるオールインワンツールですが、今回はこのtestの部分だけ使うことにしました</li> </ul> <h2 id="bun-run-test%E3%81%A8bun-test%E3%81%AE%E9%81%95%E3%81%84" data-line="33" class="code-line"> <a class="header-anchor-link" href="#bun-run-test%E3%81%A8bun-test%E3%81%AE%E9%81%95%E3%81%84" aria-hidden="true"></a> bun run testとbun testの違い</h2> <ul data-line="35" class="code-line"> <li data-line="35" class="code-line">とりあえず <code>bun test</code> を実行してみたらけっこうエラーが出て全然ダメでした</li> <li data-line="36" class="code-line">で、<a href="https://vitest.dev/guide/#writing-tests" target="_blank" rel="nofollow noopener noreferrer">vitestのドキュメント</a>を見ると <code>bun run test</code> 使ってねと書いてたのでそうしたら通りました。よかった</li> <li data-line="37" class="code-line">…と思ったけど全然速くなってない。これだとそもそもbunで実行されないので何も変わりません</li> </ul> <h2 id="bun%E3%81%A7%E5%8B%95%E3%81%8F%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B" data-line="39" class="code-line"> <a class="header-anchor-link" href="#bun%E3%81%A7%E5%8B%95%E3%81%8F%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B" aria-hidden="true"></a> bunで動くようにする</h2> <ul data-line="41" class="code-line"> <li data-line="41" class="code-line">エラーを見ていって順に直していきました</li> </ul> <h3 id="global-import%E3%82%92%E3%82%84%E3%82%81%E3%82%8B" data-line="43" class="code-line"> <a class="header-anchor-link" href="#global-import%E3%82%92%E3%82%84%E3%82%81%E3%82%8B" aria-hidden="true"></a> global importをやめる</h3> <ul data-line="45" class="code-line"> <li data-line="45" class="code-line">これjest時代から引きずってたんですが、<code>expect</code>や<code>test</code>などのAPIをグローバルimportしていてbunはそれを解釈しないのでエラーになってました</li> <li data-line="46" class="code-line">vitest.configのglobalsを無効化し、各testファイルで明示的にimportするようにして解消しました</li> </ul> <h3 id="dom-test" data-line="48" class="code-line"> <a class="header-anchor-link" href="#dom-test" aria-hidden="true"></a> dom test</h3> <ul data-line="50" class="code-line"> <li data-line="50" class="code-line">dom testが必要な場合、bunでは別途設定が必要です</li> <li data-line="51" class="code-line"><a href="https://bun.sh/docs/test/dom" target="_blank" rel="nofollow noopener noreferrer">https://bun.sh/docs/test/dom</a></li> <li data-line="52" class="code-line"> <code>happy-dom</code>を入れて設定ファイルを追加すればokです</li> </ul> <h3 id="%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%82%E3%82%8Btest" data-line="54" class="code-line"> <a class="header-anchor-link" href="#%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%82%E3%82%8Btest" aria-hidden="true"></a> タイムゾーンのあるtest</h3> <ul data-line="56" class="code-line"> <li data-line="56" class="code-line">dateをstring化した場合のtestなど実行環境のタイムゾーンによって結果が変わりますが、このへんvitestのものと違いが出ました</li> <li data-line="57" class="code-line">これはtestファイル中に<code>process.env.TZ = 'Asia/Tokyo'</code>などと指定すればokです</li> </ul> <h3 id="import%E5%85%83%E3%81%AF%E5%8B%9D%E6%89%8B%E3%81%ABbun%3Atest%E3%81%AB%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%82%8F%E3%82%8B" data-line="60" class="code-line"> <a class="header-anchor-link" href="#import%E5%85%83%E3%81%AF%E5%8B%9D%E6%89%8B%E3%81%ABbun%3Atest%E3%81%AB%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%82%8F%E3%82%8B" aria-hidden="true"></a> import元は勝手にbun:testに書き換わる</h3> <p data-line="62" class="code-line"><span class="embed-block zenn-embedded zenn-embedded-tweet"><iframe id="zenn-embedded__b09569d1aa7c" src="https://embed.zenn.studio/tweet#zenn-embedded__b09569d1aa7c" data-content="https%3A%2F%2Fx.com%2F__syumai%2Fstatus%2F1700160108053811342" frameborder="0" scrolling="no" loading="lazy"></iframe></span><a href="https://x.com/__syumai/status/1700160108053811342" style="display:none" target="_blank" rel="nofollow noopener noreferrer">https://x.com/__syumai/status/1700160108053811342</a></p> <ul data-line="64" class="code-line"> <li data-line="64" class="code-line"> <code>import {} from 'vitest'</code>と書いていても<code>bun test</code>で実行すると<code>vitest</code>の部分が<code>bun:test</code>として解釈されるので書き換えなくてもそのまま動きます</li> <li data-line="65" class="code-line">まあ最終的に<code>bun:test</code>に書き換えましたが</li> </ul> <h3 id="mock%E9%96%A2%E6%95%B0%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88" data-line="67" class="code-line"> <a class="header-anchor-link" href="#mock%E9%96%A2%E6%95%B0%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88" aria-hidden="true"></a> mock関数の置き換え</h3> <ul data-line="69" class="code-line"> <li data-line="69" class="code-line">import元は書き換えなくてもいいと書いたばかりですが、mock関数は互換性がないので書き換える必要がありました</li> </ul> <div class="code-block-container"><pre class="language-ts"><code class="language-ts code-line" data-line="71"><span class="token keyword">import</span> <span class="token punctuation">{</span> vi <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">vitest</span><span class="token template-punctuation string">`</span></span> vi<span class="token punctuation">.</span><span class="token function">fn</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">=&gt;</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> vi<span class="token punctuation">.</span><span class="token function">mock</span><span class="token punctuation">(</span><span class="token string">'foo'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre></div><div class="code-block-container"><pre class="language-ts"><code class="language-ts code-line" data-line="77"><span class="token keyword">import</span> <span class="token punctuation">{</span> mock <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">bun:test</span><span class="token template-punctuation string">`</span></span> <span class="token function">mock</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">=&gt;</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> mock<span class="token punctuation">.</span><span class="token function">module</span><span class="token punctuation">(</span><span class="token string">'foo'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">=&gt;</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre></div><h3 id="bun%E3%81%A7%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%AA%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D%E3%82%82%E3%81%82%E3%82%8B" data-line="83" class="code-line"> <a class="header-anchor-link" href="#bun%E3%81%A7%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%AA%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D%E3%82%82%E3%81%82%E3%82%8B" aria-hidden="true"></a> bunで対応できてないところもある</h3> <ul data-line="85" class="code-line"> <li data-line="85" class="code-line"><a href="https://github.com/oven-sh/bun/issues/1825" target="_blank" rel="nofollow noopener noreferrer">https://github.com/oven-sh/bun/issues/1825</a></li> <li data-line="86" class="code-line">現状では全部が全部対応してるわけじゃないです</li> <li data-line="87" class="code-line">あきらめましょう</li> </ul> <h3 id="%E3%81%98%E3%82%83%E3%81%82%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%8B%EF%BC%9F" data-line="89" class="code-line"> <a class="header-anchor-link" href="#%E3%81%98%E3%82%83%E3%81%82%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%8B%EF%BC%9F" aria-hidden="true"></a> じゃあどうするか?</h3> <ul data-line="91" class="code-line"> <li data-line="91" class="code-line">bunとvitestは並列で回すようにしました</li> <li data-line="92" class="code-line">要はbunで実行するtestとvitestで実行するtestが切り分けられれば良いです</li> <li data-line="93" class="code-line">testファイルと認識されるのは<code>*.test.ts</code>や<code>*.spec.ts</code>ですが、bun側にはマッチパターンをカスタムする設定が無いようなのでvitest側を変更しました</li> </ul> <div class="code-block-container"><pre class="language-js"><code class="language-js code-line" data-line="96"><span class="token literal-property property">test</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token literal-property property">include</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'**/*.vitest.?(c|m)[jt]s?(x)'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> </code></pre></div><ul data-line="102" class="code-line"> <li data-line="102" class="code-line">vitest.config.jsのtest.includeのところを<code>test.ts</code>ではなく<code>vitest.ts</code>に変更し、testファイルもそのようにリネームしました</li> </ul> <h2 id="%E5%91%A8%E8%BE%BA%E3%83%84%E3%83%BC%E3%83%AB" data-line="104" class="code-line"> <a class="header-anchor-link" href="#%E5%91%A8%E8%BE%BA%E3%83%84%E3%83%BC%E3%83%AB" aria-hidden="true"></a> 周辺ツール</h2> <h3 id="%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%8B%A1%E5%BC%B5" data-line="106" class="code-line"> <a class="header-anchor-link" href="#%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%8B%A1%E5%BC%B5" aria-hidden="true"></a> エディタ拡張</h3> <ul data-line="108" class="code-line"> <li data-line="108" class="code-line"><a href="https://marketplace.visualstudio.com/items?itemName=oven.bun-vscode" target="_blank" rel="nofollow noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=oven.bun-vscode</a></li> <li data-line="109" class="code-line">VSCodeでbun用の拡張もあります</li> </ul> <p data-line="111" class="code-line"><img src="https://storage.googleapis.com/zenn-user-upload/a7f26e4cd255-20241217.png" loading="lazy" class="md-img"></p> <ul data-line="113" class="code-line"> <li data-line="113" class="code-line">vitestの拡張と同じような感じで各testの上に実行ボタンが出ます</li> <li data-line="114" class="code-line">vitestのほうは専用のUIパネルですが、bunのほうは統合ターミナルにコマンドを出力して実行するのでけっこう素朴な感じです。historyに積まれるのがちょっと面倒かも</li> </ul> <h3 id="%E3%83%84%E3%83%BC%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC" data-line="116" class="code-line"> <a class="header-anchor-link" href="#%E3%83%84%E3%83%BC%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC" aria-hidden="true"></a> ツールマネージャー</h3> <ul data-line="118" class="code-line"> <li data-line="118" class="code-line">フロントエンドのツール管理は<a href="https://volta.sh/" target="_blank" rel="nofollow noopener noreferrer">volta</a>を使ってたんですが、bunは対応してない(pnpmも)ので置き換えることにしました</li> <li data-line="119" class="code-line"> <a href="https://mise.jdx.dev/" target="_blank" rel="nofollow noopener noreferrer">mise</a>を使うといろいろ良さげだったのでそちらにしてます</li> </ul> <h2 id="%E3%81%BE%E3%81%A8%E3%82%81" data-line="121" class="code-line"> <a class="header-anchor-link" href="#%E3%81%BE%E3%81%A8%E3%82%81" aria-hidden="true"></a> まとめ</h2> <ul data-line="123" class="code-line"> <li data-line="123" class="code-line">ほんと速い</li> <li data-line="124" class="code-line">productionに使っていいのか? <ul data-line="125" class="code-line"> <li data-line="125" class="code-line">まあいいんじゃないですか</li> </ul> </li> </ul> </div></div><div class="View_actions__s_UJk" id="share"><div class="LikeButton_container__YlckE style-large"><button aria-label="いいね" class="LikeButton_button__ZwdG4"><svg class="LikeButton_svgLike__Gl0Sz" viewBox="0 0 110 110"><path class="LikeButton_svgLikeLine__f9txR" d="M73,24a23.78,23.78,0,0,0-15.89,6.19,3.14,3.14,0,0,1-4.18,0A23.81,23.81,0,0,0,37,24a22,22,0,0,0-22,22c0,16.67,19.64,32.82,25.11,37.93,2.84,2.65,6.15,5.64,8.92,8.13a8.9,8.9,0,0,0,11.9,0c2.77-2.49,6.07-5.48,8.91-8.13C75.37,78.81,95,62.66,95,46A22,22,0,0,0,73,24Z" fill="currentColor"></path><path class="LikeButton_svgLikeInner__uiexS" d="M66.25,76.42c-.71.64-1.32,1.2-1.82,1.67-2.51,2.33-5.39,5-7.94,7.25a2.21,2.21,0,0,1-3,0C51,83,48.1,80.42,45.59,78.09c-.5-.47-1.12-1-1.82-1.67C38.09,71.29,23,57.67,23,46A14,14,0,0,1,37,32a15.92,15.92,0,0,1,11.65,5.23l4.73,5a2.2,2.2,0,0,0,3.23,0l4.72-5A16.06,16.06,0,0,1,73,32,14,14,0,0,1,87,46C87,57.67,71.93,71.29,66.25,76.42Z" fill="currentColor"></path><g class="LikeButton_svgLikeDecoration__78UjB"><circle cx="41.5" cy="9.5" fill="#3ea8ff" r="3.5"></circle><circle cx="98.5" cy="26.5" fill="#ffdc6e" r="3.5"></circle><circle cx="13" cy="19" fill="#c067f4" r="5"></circle><circle cx="77" cy="9" fill="#f76685" r="5"></circle><circle cx="26.5" cy="92.5" fill="#f76685" r="3.5"></circle><circle cx="105.5" cy="48.5" fill="#c067f4" r="3.5"></circle><circle cx="4.5" cy="60.5" fill="#3ea8ff" r="3.5"></circle><circle cx="94.5" cy="73.5" fill="#3ea8ff" r="1.5"></circle><circle cx="16.5" cy="75.5" fill="#ffdc6e" r="1.5"></circle><circle cx="78.5" cy="91.5" fill="#ffdc6e" r="1.5"></circle></g></svg></button></div><div class="View_menuAndShareButtonsContainer__PMtHU"><div class="View_menu__wgMxq"><button aria-label="その他の操作" class="PopoverMenuButton_menuButton__hKCa_"><svg viewBox="0 0 27 27" height="16" width="16"><path fill="currentColor" d="M12.74,20.53,3.48,11.35a.75.75,0,0,1,0-1.07L4.71,9.05a.75.75,0,0,1,1.07,0l7.49,7.41,7.49-7.41a.74.74,0,0,1,1.06,0l1.24,1.23a.77.77,0,0,1,0,1.07L13.8,20.53A.74.74,0,0,1,12.74,20.53Z"></path></svg></button></div><div class="ShareButtonsExperimental_container__CrtBj" style="flex-direction:row;align-items:center"><a aria-label="X(Twitter)にポスト" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgTwitterHorizontal__5xDGM ShareButtonsExperimental_svgTwitterBase__8FrNq" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://twitter.com/intent/tweet?url=https://zenn.dev/studio/articles/c5207260e90e8c&amp;text=bun%20test%E3%81%8C%E9%80%9F%E3%81%84%E3%81%AE%E3%81%A7vitest%E3%81%8B%E3%82%89%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E3%82%89%E3%82%81%E3%81%A1%E3%82%83%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%EF%BD%9Cmiyaoka&amp;hashtags=zenn" id="gtm-article-footer-tweet" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="27" height="28" viewBox="0 0 27 28" fill="none"><g clip-path="url(#clip0_1_18)"><path d="M16.0687 11.7356L26.12 0H23.7382L15.0106 10.1899L8.03988 0H0L10.5411 15.4089L0 27.7155H2.38199L11.5985 16.9546L18.9601 27.7155H27L16.0681 11.7356H16.0687ZM12.8062 15.5447L11.7382 14.0103L3.24025 1.80106H6.89884L13.7568 11.6543L14.8248 13.1887L23.7393 25.9963H20.0807L12.8062 15.5452V15.5447Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1_18"><rect width="27" height="27.7297" fill="white"></rect></clipPath></defs></svg></a><a aria-label="Facebookに投稿" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgFacebookHorizontal__MpfBm ShareButtonsExperimental_svgFacebookBase___gDOW" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="http://www.facebook.com/sharer.php?u=https://zenn.dev/studio/articles/c5207260e90e8c" id="gtm-article-footer-facebook" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="28" height="29" viewBox="0 0 28 29" fill="none"><g clip-path="url(#clip0_2_21)"><path d="M28 14.7812C28 7.02084 21.7319 0.729736 14 0.729736C6.26808 0.729736 0 7.02084 0 14.7812C0 21.3707 4.52032 26.9002 10.6182 28.4189V19.0753H7.73136V14.7812H10.6182V12.9309C10.6182 8.14833 12.7747 5.93158 17.453 5.93158C18.34 5.93158 19.8705 6.10637 20.4966 6.28061V10.1729C20.1662 10.138 19.5922 10.1206 18.8793 10.1206C16.5838 10.1206 15.6968 10.9935 15.6968 13.2625V14.7812H20.2698L19.4841 19.0753H15.6968V28.7297C22.629 27.8895 28.0006 21.9654 28.0006 14.7812H28Z" fill="currentColor"></path></g><defs><clipPath id="clip0_2_21"><rect width="28" height="28" fill="white" transform="translate(0 0.729736)"></rect></clipPath></defs></svg></a><a aria-label="はてなブックマークに登録" class="ShareButtonsExperimental_button__d9aXF ShareButtonsExperimental_svgHatenaBookmarkHorizontal__ccpWn ShareButtonsExperimental_svgHatenaBookmarkBase__VXz6p" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://b.hatena.ne.jp/add?mode=confirm&amp;url=https://zenn.dev/studio/articles/c5207260e90e8c&amp;title=bun%20test%E3%81%8C%E9%80%9F%E3%81%84%E3%81%AE%E3%81%A7vitest%E3%81%8B%E3%82%89%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E3%82%89%E3%82%81%E3%81%A1%E3%82%83%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%EF%BD%9Cmiyaoka" id="gtm-article-footer-hatena-bookmark" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="27" height="28" viewBox="0 0 27 28" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.4999 0.729736H21.5001C24.5376 0.729736 27 3.19213 27 6.22964V22.2298C27 25.2673 24.5376 27.7297 21.5001 27.7297H5.4999C2.46239 27.7297 0 25.2673 0 22.2298V6.22964C0 3.19213 2.46239 0.729736 5.4999 0.729736ZM12.98 13.7472C13.8521 13.8136 14.5319 14.1209 15.0212 14.6673V14.6679C15.512 15.2127 15.7572 15.9444 15.7572 16.8543C15.7572 17.5126 15.62 18.0877 15.3436 18.5867C15.0692 19.084 14.6756 19.4712 14.1604 19.7433C13.7441 19.9658 13.2289 20.1278 12.6155 20.2245C12.001 20.3179 10.9966 20.3665 9.6039 20.3665H6.13656V8.09392H9.50184C10.8859 8.09392 11.8503 8.13875 12.4016 8.22623C12.9503 8.31695 13.4206 8.4703 13.8164 8.68792C14.269 8.93902 14.6129 9.27437 14.8527 9.69341C15.0865 10.1151 15.2069 10.6028 15.2069 11.1546C15.2069 11.8512 15.0309 12.4053 14.6761 12.813C14.3197 13.2261 13.756 13.5355 12.98 13.7472ZM9.96192 10.8144H9.24372H9.24318V13.2768H9.91116C10.7352 13.2768 11.2984 13.1856 11.6073 13.0058C11.9124 12.8227 12.0663 12.5273 12.0663 12.0667C12.0663 11.6061 11.9216 11.2821 11.6375 11.0947C11.3497 10.9084 10.7919 10.8144 9.96192 10.8144ZM10.4128 18.1514C11.2028 18.1514 11.7661 18.0531 12.0928 17.8523V17.8528C12.4227 17.653 12.5863 17.3209 12.5863 16.8581C12.5863 16.3408 12.4367 15.9806 12.1338 15.7765C11.8357 15.5724 11.2747 15.4703 10.463 15.4703H9.24372V18.1514H10.4128ZM19.3093 17.257C18.4502 17.257 17.7547 17.9525 17.7547 18.8111C17.7547 19.6697 18.4507 20.3658 19.3093 20.3658C20.1679 20.3658 20.8634 19.6697 20.8634 18.8111C20.8634 17.9525 20.1668 17.257 19.3093 17.257ZM17.9593 8.09318H20.6593V16.2753H17.9593V8.09318Z" fill="currentColor"></path></svg></a></div></div></div><span style="display:block;height:2rem;flex-shrink:0"></span><aside class="View_authorInfo__F19rR"><div class="ProfileCard_container__YfvQl"><a class="ProfileCard_avatar__tIJpR" href="/miyaoka"><img alt="miyaoka" class="AvatarImage_plain__Fgp4R " height="80" loading="lazy" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/aea58e79d0.jpeg" width="80"/></a><div class="ProfileCard_name__qXamf"><a class="ProfileCard_displayName__gRUeY" href="/miyaoka">miyaoka</a></div><div class="ProfileCard_content__1w905"><p class="Paragraph_common__yRSrj Paragraph_sidenote__9NTjJ Paragraph_decorateLink__aIAFh"><span>Software Engineer</span></p><div class="ProfileCard_actions__2ZjZ8"><span class="ProfileCard_follow__ng60N"></span><a aria-label="@miyaoka" class="ProfileCard_link__oexkj ProfileCard_linkBase__hVELe" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://github.com/miyaoka" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg x="0px" y="0px" viewBox="0 0 27 27" style="enable-background:new 0 0 27 27" xml:space="preserve" aria-label="GitHub"><path fill="currentColor" d="M13.4,1.2C7,1,1.8,6,1.7,12.4c0,0.1,0,0.4,0,0.5c0,5.1,3.2,9.8,8.2,11.5c0.6,0.1,0.7-0.2,0.7-0.6s0-1.8,0-2.9 c0,0-3.3,0.6-4-1.5c0,0-0.6-1.3-1.3-1.8c0,0-1.1-0.7,0.1-0.7c0.7,0.1,1.5,0.6,1.8,1.2c0.6,1.2,2.2,1.7,3.4,1h0.1 c0.1-0.6,0.4-1.2,0.7-1.6C8.7,17.1,6,16.9,6,12.3c0-1.1,0.5-2.1,1.2-2.8c0-1.1,0-2.2,0.3-3.2c1-0.4,3.3,1.3,3.3,1.3c2-0.6,4-0.6,6,0 c0,0,2.2-1.6,3.2-1.2c0.5,1,0.5,2.2,0.1,3.2c0.7,0.7,1.2,1.8,1.2,2.8c0,4.5-2.8,5-5.5,5.2c0.6,0.6,0.9,1.3,0.7,2.2c0,1.7,0,3.5,0,4 s0.2,0.6,0.7,0.6c4.9-1.7,8.2-6.2,8-11.5c0.1-6.4-5.1-11.6-11.6-11.6C13.5,1.2,13.4,1.2,13.4,1.2z"></path></svg></a><a aria-label="@miyaoka" class="ProfileCard_twitterLink__l4sOK ProfileCard_linkBase__hVELe" data-tooltip-for-desktop="true" data-tooltip-position="bottom" href="https://twitter.com/miyaoka" rel="nofollow noopener noreferrer" role="tooltip" target="_blank"><svg width="27" height="28" viewBox="0 0 27 28" fill="none" aria-label="X(Twitter)"><g clip-path="url(#clip0_1_18)"><path d="M16.0687 11.7356L26.12 0H23.7382L15.0106 10.1899L8.03988 0H0L10.5411 15.4089L0 27.7155H2.38199L11.5985 16.9546L18.9601 27.7155H27L16.0681 11.7356H16.0687ZM12.8062 15.5447L11.7382 14.0103L3.24025 1.80106H6.89884L13.7568 11.6543L14.8248 13.1887L23.7393 25.9963H20.0807L12.8062 15.5452V15.5447Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1_18"><rect width="27" height="27.7297" fill="white"></rect></clipPath></defs></svg></a></div></div></div></aside><div class="View_publicationInfo__MKZ62"><div class="ProfileCard_container__YfvQl"><a class="ProfileCard_avatar__tIJpR" href="/p/studio"><img alt="Studio Tech Blog" class="AvatarImage_plain__Fgp4R AvatarImage_withPublication__hNtIe" height="80" loading="lazy" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/e0bca5fd81.jpeg" width="80"/></a><div class="ProfileCard_name__qXamf"><a class="ProfileCard_displayName__gRUeY" href="/p/studio">Studio Tech Blog</a><span><a class="PublicationLabelLink_link__JBqs2" href="/faq#what-is-publication">Publication</a></span></div><div class="ProfileCard_content__1w905"><p class="Paragraph_common__yRSrj Paragraph_sidenote__9NTjJ Paragraph_decorateLink__aIAFh"><span>Web制作を、ノーコードで。 ノーコードWeb制作プラットフォーム「Studio」開発で培った技術的な知見を投稿します。 Unleash Creativity.</span></p><div class="ProfileCard_actions__2ZjZ8"><span class="ProfileCard_follow__ng60N"></span></div></div></div></div><span style="display:block;height:2rem;flex-shrink:0"></span><aside class="SendBadgeCta_container__peDjp"><div class="SendBadgeCta_content__FGxIx"><div class="SendBadgeCta_title__NFpA3">バッジを贈って著者を応援しよう</div><span style="display:block;height:0.5rem;flex-shrink:0"></span><p class="Paragraph_common__yRSrj Paragraph_sidenote-sm__zfJpo">バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。</p><div class="SendBadgeCta_buttonContainer__5_7_u"><button class="Button_primary__VcoA9 Button_baseStyle__Vhn6Y Button_large__jO0IW Button_fontBold__BN6Co">バッジを贈る</button></div></div><svg viewBox="0 0 318 451" fill="currentColor" class="SendBadgeCta_icon__mcUsF"><path d="M175.12,41.58V13.2a8.87,8.87,0,0,0-17.73.6V41.58a8.87,8.87,0,1,0,17.73.6Z"></path><path d="M75,44.52,94.62,64.17c.1.11.21.22.32.32a8.87,8.87,0,0,0,12.18-12.86L87.52,32A8.87,8.87,0,0,0,75,44.52Z"></path><path d="M253.56,44.52A8.87,8.87,0,0,0,241,32L221.37,51.63,221,52A8.87,8.87,0,0,0,233.9,64.17h0Z"></path><path d="M18.06,262.07a28.08,28.08,0,0,0-.7,39.08l22.55,27.78,12.58,15.5,32.78,40.4A24.72,24.72,0,0,0,104.53,394H203a35.83,35.83,0,0,1,15.13,3.36,8,8,0,0,0,9-1.68h0a8.09,8.09,0,0,0-2.2-13h0a46,46,0,0,0-19.6-4.4H104.57a9.06,9.06,0,0,1-7.08-3.37L72.76,344.4,58.37,326.68l-.72-.89L39.91,303.93,29.32,290.42h0a12.35,12.35,0,0,1,0-17.46,10.33,10.33,0,0,1,1.43-1.2,12.1,12.1,0,0,1,4.76-2.15h.17a12.73,12.73,0,0,1,2.06-.21H38a12.47,12.47,0,0,1,3.53.52l.71.23c.23.08.45.18.68.27h0A12.55,12.55,0,0,1,46.76,273l11,10.68,14,13.53,21.88,21.13a23.65,23.65,0,0,0-.56,2.63,8.77,8.77,0,0,0-.21,1.6l-.06.84v3.51a3.31,3.31,0,0,1,0,.62,2.53,2.53,0,0,0,0,.55,1.79,1.79,0,0,0,.07.62c.07.18,0,.33.07.54s.08.42.1.62l.09.54.12.61.12.53a2.93,2.93,0,0,0,.15.6c0,.18.09.33.14.53s.12.43.17.6l.16.52c.06.19.13.42.19.59s.12.34.19.51l.21.58.21.51.24.57c.07.17.15.31.23.5s.17.37.26.55l.25.51.28.53.28.5.3.52.3.49c.11.16.21.33.32.5l.33.48.33.49c.12.16.24.31.35.47l.36.47.37.47c.13.14.24.28.37.44s.33.37.41.46.15.18.23.26l.15.17.43.45.4.4.46.44.4.38.5.43.41.36.53.42.42.33.56.41.42.31.61.4.41.27.66.4.4.24.72.39.38.2.8.4.33.16.94.4.23.1c.79.33,1.61.62,2.45.88a26.76,26.76,0,0,0,5.83,1.08,21.47,21.47,0,0,0,2.78.11H184.7l.48-.07.28-.06.43-.11.28-.09.42-.15.25-.11a2.93,2.93,0,0,0,.44-.21l.21-.1c.2-.11.4-.23.59-.36l.17-.12.38-.29c.2-.16.4-.34.59-.52h0c.19-.19.38-.4.56-.61l.11-.15c.13-.17.25-.35.37-.52l.15-.23.27-.49.13-.26.21-.49a.45.45,0,0,1,.1-.3,1.7,1.7,0,0,0,.16-.51,1.06,1.06,0,0,1,.07-.3c.05-.2.08-.39.11-.58v-.26a6.31,6.31,0,0,0,0-.87,10.7,10.7,0,0,0-.11-1.27,7.87,7.87,0,0,0-7.76-6.6H120.77a12.35,12.35,0,0,1-12.3-13.57,5.65,5.65,0,0,1,.16-1.07v-.23c.07-.33.15-.67.25-1h0c.11-.36.23-.68.36-1a.94.94,0,0,1,.1-.23c.12-.29.26-.58.41-.86v-.07c.16-.3.34-.58.52-.86l.16-.24.15-.22c.12-.17.25-.33.37-.48l.08-.11c.21-.25.43-.5.66-.74l.19-.19c.22-.22.44-.43.68-.63l.06-.06c.26-.22.52-.42.8-.62l.21-.15c.26-.18.53-.36.8-.52h.06c.29-.17.59-.32.9-.47l.24-.12c.29-.13.59-.26.89-.37h.07c.35-.12.67-.22,1-.31l.27-.08c.36-.08.67-.16,1-.22h.07a4.73,4.73,0,0,1,1-.14h65.95a46.51,46.51,0,0,0,12.79-1.77,43.8,43.8,0,0,0,4.85-1.75h.09c.76-.34,1.51-.69,2.25-1.07a62.92,62.92,0,0,1,29.3-7.17h3.1l1.45.08.93.08a11.73,11.73,0,0,1,1.33.12l1,.11.94.11.38.06.87.13,1.32.21.91.17,1.28.25.91.2,1.26.3.91.22,1.24.34.9.25,1.28.39.83.27c.59.19,1.17.39,1.75.6l1.25.47c.31.12.63.23.94.36H260c.89.35,1.75.72,2.62,1.1l.44.21c.71.32,1.4.66,2.09,1l.68.32c.67.36,1.34.71,2,1.08l.47.26c.81.41,1.62.92,2.41,1.41l.42.27c.64.39,1.28.81,1.91,1.23l.67.46c.58.4,1.16.81,1.73,1.23l.54.39c.73.55,1.46,1.11,2.16,1.69l.38.31c.58.47,1.15,1,1.72,1.47l.63.56c.48.46,1,.92,1.48,1.38l.55.53c.23.24,1.5,1.75,3,3.55a5.2,5.2,0,0,0,.51.55,8,8,0,0,0,11.31,0h0a8,8,0,0,0,.36-11q-1.08-1.23-2.22-2.43c-1.68-1.73-3.43-3.39-5.25-5V207.16h7a8.88,8.88,0,0,0,8.87-8.86V152.38a8.88,8.88,0,0,0-8.87-8.87H284.85c5.62-15,1.68-32.58-10.89-43.16a49.14,49.14,0,0,0-28.23-11.56c-20.31-1.46-44.09,12.21-58.31,24.38-1,.89-2.13,1.82-3.13,2.76h-38c-1-.94-2.14-1.87-3.14-2.76-14.22-12.16-38-25.84-58.33-24.38a49,49,0,0,0-28.24,11.56C44,110.93,40.12,128.51,45.69,143.51H32.91a8.88,8.88,0,0,0-8.86,8.87V198.3a8.85,8.85,0,0,0,8.86,8.86h7v46.77a20.38,20.38,0,0,0-2.06-.08A27.76,27.76,0,0,0,18.06,262ZM196,207.17h76.88v87.5c-1.46-.72-2.92-1.42-4.39-2.08a83.5,83.5,0,0,0-14.76-4.9,81.38,81.38,0,0,0-18.58-2.15,78.77,78.77,0,0,0-36.42,8.92,25.37,25.37,0,0,1-2.68,1.18Zm.05-45.91h92.74v28.17h-92.7Zm0-32c.9-.86,1.9-1.71,2.9-2.57,12-10.28,30.55-20.22,43.76-20.22.6,0,1.17.06,1.75.06a31.32,31.32,0,0,1,18.08,7.4c8.65,7.25,9.65,20.71,2.08,29.58H196.06Zm-43.71,4.42h26V297.39h-26Zm-17.78,9.86H66C58.4,134.68,59.41,121.22,68,114a31.34,31.34,0,0,1,18.09-7.47c13.28-1,33,9.41,45.5,20.16,1,.86,2,1.72,2.92,2.57ZM57.65,207.16h76.88v90.2H121.27A29,29,0,0,0,102,304.8l-19.1-18.45L57.69,262Zm-15.86-45.9h92.74v28.17H41.83Z"></path></svg></aside></div></div><div id="discuss"><div class="ArticleComments_commentsContainer__kOO0n"><section class="ArticleComments_comments__y4Azs"><div class="ArticleComments_emptyContainer__I4fw6"><h3 class="Heading_size-lg__KD3Up Heading_centered__lNLF_">Discussion</h3><img class="ArticleComments_emptyImg__FGwCr" src="https://static.zenn.studio/images/drawing/discussion.png" width="300"/></div></section></div></div></section><aside class="View_sidebarContainer__YwcNH"><div class="ArticleSidebar_container__jSRJw"><div><div class="ArticleSidebar_user__vJ7nz ArticleSidebar_sidebarCard__AtM_Z"><div class="SidebarUserBio_container__iWemi"><a href="/miyaoka"><img alt="miyaoka" class="AvatarImage_border__pDIjF AvatarImage_plain__Fgp4R " height="60" loading="lazy" referrerPolicy="no-referrer" src="https://storage.googleapis.com/zenn-user-upload/avatar/aea58e79d0.jpeg" width="60"/></a><div class="SidebarUserBio_author__cM7pP"><a class="SidebarUserBio_name__0zFdT" href="/miyaoka">miyaoka</a><div class="SidebarUserBio_actions__oFupD"><a class="SidebarUserBio_link__nnh24" href="https://github.com/miyaoka" rel="nofollow noopener noreferrer" target="_blank"><span aria-label="@miyaoka" data-tooltip-for-desktop="true" data-tooltip-position="bottom" role="tooltip"><svg x="0px" y="0px" viewBox="0 0 27 27" style="enable-background:new 0 0 27 27" xml:space="preserve" aria-label="GitHub"><path fill="currentColor" d="M13.4,1.2C7,1,1.8,6,1.7,12.4c0,0.1,0,0.4,0,0.5c0,5.1,3.2,9.8,8.2,11.5c0.6,0.1,0.7-0.2,0.7-0.6s0-1.8,0-2.9 c0,0-3.3,0.6-4-1.5c0,0-0.6-1.3-1.3-1.8c0,0-1.1-0.7,0.1-0.7c0.7,0.1,1.5,0.6,1.8,1.2c0.6,1.2,2.2,1.7,3.4,1h0.1 c0.1-0.6,0.4-1.2,0.7-1.6C8.7,17.1,6,16.9,6,12.3c0-1.1,0.5-2.1,1.2-2.8c0-1.1,0-2.2,0.3-3.2c1-0.4,3.3,1.3,3.3,1.3c2-0.6,4-0.6,6,0 c0,0,2.2-1.6,3.2-1.2c0.5,1,0.5,2.2,0.1,3.2c0.7,0.7,1.2,1.8,1.2,2.8c0,4.5-2.8,5-5.5,5.2c0.6,0.6,0.9,1.3,0.7,2.2c0,1.7,0,3.5,0,4 s0.2,0.6,0.7,0.6c4.9-1.7,8.2-6.2,8-11.5c0.1-6.4-5.1-11.6-11.6-11.6C13.5,1.2,13.4,1.2,13.4,1.2z"></path></svg></span></a><a class="SidebarUserBio_twitterLink__yGgDq SidebarUserBio_link__nnh24" href="https://twitter.com/miyaoka" rel="nofollow noopener noreferrer" target="_blank"><span aria-label="@miyaoka" data-tooltip-for-desktop="true" data-tooltip-position="bottom" role="tooltip"><svg width="27" height="28" viewBox="0 0 27 28" fill="none" aria-label="X(Twitter)"><g clip-path="url(#clip0_1_18)"><path d="M16.0687 11.7356L26.12 0H23.7382L15.0106 10.1899L8.03988 0H0L10.5411 15.4089L0 27.7155H2.38199L11.5985 16.9546L18.9601 27.7155H27L16.0681 11.7356H16.0687ZM12.8062 15.5447L11.7382 14.0103L3.24025 1.80106H6.89884L13.7568 11.6543L14.8248 13.1887L23.7393 25.9963H20.0807L12.8062 15.5452V15.5447Z" fill="currentColor"></path></g><defs><clipPath id="clip0_1_18"><rect width="27" height="27.7297" fill="white"></rect></clipPath></defs></svg></span></a></div></div></div><span style="display:block;height:1rem;flex-shrink:0"></span><p class="Paragraph_common__yRSrj Paragraph_description-sm__vmr99 Paragraph_decorateLink__aIAFh"><span>Software Engineer</span></p><span style="display:block;height:1rem;flex-shrink:0"></span><button class="Button_primary__VcoA9 Button_baseStyle__Vhn6Y Button_full__RIG_z Button_large__jO0IW Button_fontBold__BN6Co">バッジを贈る</button><div class="ArticleSidebar_badgeAbout__Y3cIb"><a class="TextAnchor_anchorColoredSubtle__ZUESd TextAnchor_anchorColored__PlNnP ArticleSidebar_badgeAboutLink__aqdNT" href="/faq#badges">バッジを贈るとは<svg viewBox="0 0 24 24" fill="currentColor" class="TextAnchor_icon__1hdMx"><path d="M0 0h24v24H0z" fill="none"></path><path d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"></path></svg></a></div></div></div><span style="display:block;height:1.5rem;flex-shrink:0"></span><div class="ArticleSidebar_sticky__W61mq"><div style="display:flex;gap:1.5rem;flex-direction:column;align-items:stretch;flex-wrap:nowrap"><div class="ArticleSidebarToc_toc__dUPn8"><div class="ArticleSidebarToc_tocTitle__A3VjO">目次</div><div class="ArticleToc_toc__WF75u"><ol class="ol-depth-1"><li><a href="#%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91">きっかけ</a></li><li><a href="#%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E7%B5%90%E6%9E%9C">置き換えた結果</a><ol class="ol-depth-2"><li><a href="#before-(vitest)">before (vitest)</a></li><li><a href="#after-(bun-%2B-vitest)">after (bun + vitest)</a></li></ol></li><li><a href="#bun%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%AA%E3%81%AE%EF%BC%9F">bunってどうなの?</a></li><li><a href="#bun-run-test%E3%81%A8bun-test%E3%81%AE%E9%81%95%E3%81%84">bun run testとbun testの違い</a></li><li><a href="#bun%E3%81%A7%E5%8B%95%E3%81%8F%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B">bunで動くようにする</a><ol class="ol-depth-2"><li><a href="#global-import%E3%82%92%E3%82%84%E3%82%81%E3%82%8B">global importをやめる</a></li><li><a href="#dom-test">dom test</a></li><li><a href="#%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%82%E3%82%8Btest">タイムゾーンのあるtest</a></li><li><a href="#import%E5%85%83%E3%81%AF%E5%8B%9D%E6%89%8B%E3%81%ABbun%3Atest%E3%81%AB%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%82%8F%E3%82%8B">import元は勝手にbun:testに書き換わる</a></li><li><a href="#mock%E9%96%A2%E6%95%B0%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88">mock関数の置き換え</a></li><li><a href="#bun%E3%81%A7%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%AA%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D%E3%82%82%E3%81%82%E3%82%8B">bunで対応できてないところもある</a></li><li><a href="#%E3%81%98%E3%82%83%E3%81%82%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%8B%EF%BC%9F">じゃあどうするか?</a></li></ol></li><li><a href="#%E5%91%A8%E8%BE%BA%E3%83%84%E3%83%BC%E3%83%AB">周辺ツール</a><ol class="ol-depth-2"><li><a href="#%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%8B%A1%E5%BC%B5">エディタ拡張</a></li><li><a href="#%E3%83%84%E3%83%BC%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC">ツールマネージャー</a></li></ol></li><li><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></li></ol></div></div></div></div></div></aside></div></div></div></div><div id="related-contents"></div></article><footer class="AppFooter_footer__pqSnY"><div class="Container_wide__ykGLh Container_common__figYY"><div class="AppFooter_inner__uGxbT" data-nosnippet="true"><div class="AppFooter_brandingColumn__BikTT"><a class="ZennLogo_logoLink__NJS2l" href="/"><svg x="0px" y="0px" viewBox="0 0 377.4 88.3" aria-label="Zenn | エンジニアのための情報共有コミュニティ" class="ZennLogo_logoSvg__yOhcg" height="20" width="85"><title>Zenn</title><g fill="currentColor"><path d="M233,56.8h-39c0.5,3.5,2.2,6.8,4.8,9.2c2.7,2.3,6.2,3.5,9.8,3.4c2.8,0,5.6-0.5,8.2-1.7c2.5-1.1,4.8-2.8,6.5-5l8.2,9.5 c-2.5,3.4-5.7,6.1-9.5,7.9c-4.6,2.2-9.6,3.3-14.7,3.2c-5.7,0.1-11.4-1.2-16.5-4c-4.5-2.5-8.2-6.3-10.7-10.9s-3.8-9.8-3.7-15.1v-2.2 c-0.1-5.7,1.1-11.3,3.5-16.5c2.2-4.7,5.7-8.6,10.1-11.3c4.7-2.8,10.1-4.2,15.5-4.1c5.2-0.1,10.3,1.1,14.9,3.7 c4.1,2.5,7.4,6.2,9.4,10.5c2.2,5.1,3.3,10.5,3.2,16.1V56.8z M216.1,43.9c0.1-2.9-0.9-5.7-2.8-7.9c-1.8-1.9-4.4-2.9-7.9-2.9 c-2.9-0.1-5.8,1.1-7.7,3.2c-2,2.6-3.3,5.7-3.6,9h22V43.9z"></path><path d="M128.3,67.9h36.1v14.7h-56.9V72l35.8-54.3h-36.2V2.9h56.6v10.4L128.3,67.9z"></path><path d="M248.8,50.7c0-19.1,12.7-29.2,28.2-29.2s27.9,10.1,27.9,29.2V82h-16V51.4c0-10.6-4.8-16.1-12-16.1s-12.4,5.5-12.4,16.1 v30.7h-15.8L248.8,50.7L248.8,50.7z"></path><path d="M320.3,50.7c0-19.1,12.7-29.2,28.2-29.2s27.9,10.1,27.9,29.2V82h-16V51.4c0-10.6-4.8-16.1-12-16.1S336,40.8,336,51.4v30.7 h-15.8L320.3,50.7L320.3,50.7z"></path></g><path fill="#3EA8FF" class="st0" d="M2.4,83.3h17c0.9,0,1.7-0.5,2.2-1.2L68.4,5.2C69,4.2,68.3,3,67.1,3H51c-0.8,0-1.5,0.4-1.9,1.1L1.6,81.9 C1.3,82.5,1.7,83.3,2.4,83.3z"></path><path fill="#3EA8FF" class="st0" d="M61,82.1l22.1-35.5c0.7-1.1-0.1-2.5-1.4-2.5H65.7c-0.6,0-1.2,0.3-1.5,0.8L41.5,81.2c-0.6,0.9,0.1,2.1,1.2,2.1 h16.3C59.8,83.3,60.6,82.9,61,82.1z"></path></svg></a><p class="AppFooter_siteDescription__NWGP2">エンジニアのための<br aria-hidden="true"/>情報共有コミュニティ</p></div><div class="AppFooter_navColumns__ahV9g"><nav class="AppFooter_navColumn__47qTk"><h4 class="AppFooter_navColumnTitle__vVeiQ">About</h4><ul><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/about">Zennについて</a></div></li><li><a href="https://classmethod.jp" rel="nofollow noopener noreferrer" target="_blank">運営会社</a></li><li><a href="https://info.zenn.dev" rel="nofollow noopener noreferrer" target="_blank">お知らせ・リリース</a></li></ul></nav><nav class="AppFooter_navColumn__47qTk"><h4 class="AppFooter_navColumnTitle__vVeiQ">Guides</h4><ul><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/manual">使い方</a></div></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/biz-lp">法人向けメニュー</a><span class="NewLabel_newLabelSecondary__6Iy_T NewLabel_newLabel__Xva_r">New</span></div></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/publications">Publication / Pro</a></div></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/faq">よくある質問</a></div></li></ul></nav><nav class="AppFooter_navColumn__47qTk"><h4 class="AppFooter_navColumnTitle__vVeiQ">Links</h4><ul><li><a href="https://twitter.com/zenn_dev" rel="nofollow noopener noreferrer" target="_blank">X(Twitter)</a></li><li><a href="https://github.com/zenn-dev" rel="nofollow noopener noreferrer" target="_blank">GitHub</a></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/mediakit">メディアキット</a></div></li></ul></nav><nav class="AppFooter_navColumn__47qTk"><h4 class="AppFooter_navColumnTitle__vVeiQ">Legal</h4><ul><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/terms">利用規約</a></div></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/privacy">プライバシーポリシー</a></div></li><li><div style="display:flex;gap:0.5rem;flex-direction:row;align-items:center;flex-wrap:nowrap"><a href="/terms/transaction-law">特商法表記</a></div></li></ul></nav></div></div><div class="AppFooter_copyright__J_Jbe" data-nosnippet="true"><div class="AnnouncementPopUp_hiddenWrapper__ThDWT"><div aria-hidden="true" class="PopUp_popup__lIgfz AnnouncementPopUp_container__Pb5q2"><div></div></div></div><a href="https://classmethod.jp/"><svg width="115" height="25" viewBox="0 0 271 60" class="AppFooter_classmethodLogo__1RFuV"><g clip-path="url(#clip0_2_90)"><path d="M264.636 3.1617C265.475 3.16128 266.279 3.49393 266.873 4.08651C267.466 4.67909 267.8 5.48309 267.801 6.32175V53.0703C267.801 53.5668 267.703 54.0585 267.513 54.5171C267.323 54.9758 267.045 55.3926 266.694 55.7437C266.342 56.0948 265.926 56.3733 265.467 56.5633C265.008 56.7533 264.517 56.851 264.02 56.851H6.93132C5.92861 56.851 4.96697 56.4527 4.25795 55.7437C3.54892 55.0347 3.1506 54.073 3.1506 53.0703V6.93139C3.1506 5.92868 3.54892 4.96704 4.25795 4.25802C4.96697 3.54899 5.92861 3.15067 6.93132 3.15067H225.05C225.137 3.15178 225.221 3.17053 225.3 3.20575C225.379 3.24097 225.449 3.29192 225.507 3.35546L233.987 12.76C234.28 13.0541 234.628 13.2875 235.011 13.4467C235.394 13.606 235.805 13.688 236.22 13.688C236.635 13.688 237.046 13.606 237.429 13.4467C237.812 13.2875 238.16 13.0541 238.453 12.76L246.933 3.35231C246.99 3.28778 247.061 3.23616 247.139 3.20086C247.218 3.16555 247.303 3.14737 247.39 3.14752H264.65L264.636 3.1617ZM264.636 7.17095e-05H246.1C246.006 0.000759845 245.914 0.0205359 245.828 0.058188C245.742 0.0958401 245.665 0.150575 245.602 0.219038L237.347 9.39516C237.334 9.40757 237.323 9.4213 237.313 9.43611C237.018 9.72475 236.622 9.88642 236.21 9.88642C235.797 9.88642 235.402 9.72475 235.107 9.43611C235.094 9.42426 235.082 9.41045 235.072 9.39516L226.843 0.239517C226.775 0.162922 226.691 0.10189 226.597 0.0605717C226.504 0.0192536 226.402 -0.00138099 226.3 7.17095e-05H6.93132C5.09302 7.17095e-05 3.33001 0.730333 2.03014 2.03021C0.730262 3.33008 0 5.09309 0 6.93139L0 53.0719C0 54.9102 0.730262 56.6732 2.03014 57.9731C3.33001 59.273 5.09302 60.0032 6.93132 60.0032H264.02C265.858 60.0032 267.621 59.273 268.921 57.9731C270.221 56.6732 270.951 54.9102 270.951 53.0719V6.31545C270.949 4.64114 270.283 3.03602 269.099 1.8521C267.916 0.668193 266.31 0.00215599 264.636 7.17095e-05Z" fill="currentColor"></path><path d="M29.9653 23.8863C30.0769 23.8895 30.1866 23.9161 30.2873 23.9644C30.388 24.0126 30.4775 24.0813 30.5501 24.1662C30.6226 24.251 30.6766 24.3501 30.7086 24.4571C30.7405 24.5641 30.7498 24.6766 30.7357 24.7873V28.3554C30.7357 28.85 30.4679 29.0769 29.9653 29.0769H22.6008C18.4483 29.0769 17.815 30.4789 17.815 36.1657C17.815 41.8526 18.4452 43.2546 22.6008 43.2546H29.9653C30.46 43.2546 30.7357 43.4814 30.7357 43.9351V47.5457C30.7357 48.0892 30.4679 48.316 29.9653 48.4058C27.5367 48.8538 25.0703 49.0648 22.6008 49.0359C12.982 49.0359 11.1326 46.1074 11.1326 36.1642C11.1326 26.2209 12.982 23.2955 22.6008 23.2955C25.0681 23.2729 27.5325 23.4684 29.9653 23.88" fill="currentColor"></path><path d="M39.7637 17.6701C39.9308 17.6701 40.0911 17.7365 40.2093 17.8547C40.3274 17.9729 40.3938 18.1331 40.3938 18.3003V48.4389C40.3938 48.606 40.3274 48.7663 40.2093 48.8845C40.0911 49.0026 39.9308 49.069 39.7637 49.069H34.3872C34.297 49.0756 34.2064 49.0626 34.1216 49.0311C34.0368 48.9995 33.9598 48.9501 33.8959 48.8861C33.8319 48.8221 33.7825 48.7452 33.7509 48.6604C33.7193 48.5756 33.7064 48.485 33.713 48.3948V18.3444C33.7069 18.258 33.7187 18.1713 33.7477 18.0897C33.7766 18.008 33.8221 17.9333 33.8812 17.87C33.9403 17.8067 34.0118 17.7563 34.0913 17.722C34.1708 17.6876 34.2565 17.6699 34.3431 17.6701H39.7637Z" fill="currentColor"></path><path d="M169.156 35.857V37.259C169.156 38.1601 168.888 38.4767 167.711 38.4767H153.533C153.623 42.541 154.709 43.2624 158.636 43.2624H166.679C166.846 43.2624 167.007 43.3288 167.125 43.447C167.243 43.5652 167.309 43.7255 167.309 43.8926V47.6733C167.32 47.8536 167.26 48.031 167.143 48.1682C167.025 48.3054 166.859 48.3917 166.679 48.409C163.831 48.8866 160.945 49.0976 158.058 49.0391C148.934 49.0391 146.716 46.4682 146.716 36.1673C146.716 25.8664 148.929 23.2955 158.058 23.2955C167.187 23.2955 169.121 25.7782 169.168 35.8507M153.499 34.0911H162.437C162.388 30.1166 161.35 29.0785 158.058 29.0785C154.765 29.0785 153.54 30.1166 153.499 34.0911Z" fill="currentColor"></path><path d="M183.056 43.2908H181.07C179.083 43.2908 178.409 42.9332 178.409 40.9877V29.1462H182.706C182.793 29.1449 182.879 29.126 182.958 29.0907C183.037 29.0553 183.108 29.0043 183.167 28.9407C183.226 28.8771 183.271 28.8022 183.3 28.7206C183.33 28.6389 183.342 28.5522 183.337 28.4657V23.9556C183.337 23.7885 183.27 23.6282 183.152 23.51C183.034 23.3919 182.874 23.3255 182.706 23.3255H178.409V18.2971C178.407 18.1308 178.339 17.9719 178.222 17.8542C178.104 17.7366 177.945 17.6694 177.779 17.667H172.355C172.188 17.667 172.028 17.7334 171.91 17.8515C171.791 17.9697 171.725 18.13 171.725 18.2971V43.242C171.725 48.9351 175.246 49.0706 179.129 49.0706C180.418 49.0631 181.704 48.927 182.966 48.6642C183.072 48.6611 183.176 48.6356 183.272 48.5893C183.367 48.5431 183.452 48.4772 183.52 48.396C183.588 48.3147 183.638 48.22 183.667 48.118C183.696 48.0159 183.703 47.909 183.688 47.804V43.9635C183.694 43.8771 183.682 43.7904 183.653 43.7088C183.624 43.6271 183.579 43.5524 183.52 43.4891C183.46 43.4258 183.389 43.3754 183.309 43.3411C183.23 43.3067 183.144 43.289 183.058 43.2892" fill="currentColor"></path><path d="M234.551 36.1673C234.551 46.4603 232.426 49.0391 223.034 49.0391C213.642 49.0391 211.517 46.4682 211.517 36.1673C211.517 25.8664 213.683 23.2955 223.034 23.2955C232.385 23.2955 234.551 25.8255 234.551 36.1673ZM218.248 36.1673C218.248 41.8604 218.922 43.2561 223.034 43.2561C227.146 43.2561 227.867 41.8541 227.867 36.1673C227.867 30.4805 227.193 29.0785 223.034 29.0785C218.875 29.0785 218.248 30.4805 218.248 36.1673Z" fill="currentColor"></path><path d="M202.566 23.6594C199.378 23.1745 196.135 23.1745 192.947 23.6594V18.3034C192.947 18.1363 192.881 17.976 192.763 17.8578C192.645 17.7397 192.484 17.6733 192.317 17.6733H186.892C186.725 17.6733 186.565 17.7397 186.446 17.8578C186.328 17.976 186.262 18.1363 186.262 18.3034V48.3916C186.256 48.478 186.268 48.5647 186.296 48.6463C186.325 48.7279 186.371 48.8027 186.43 48.866C186.489 48.9292 186.561 48.9796 186.64 49.014C186.72 49.0484 186.805 49.0661 186.892 49.0658H192.317C192.484 49.0658 192.645 48.9995 192.763 48.8813C192.881 48.7631 192.947 48.6028 192.947 48.4357V36.1799C192.947 31.3595 193.084 29.091 197.733 29.091C202.382 29.091 202.595 31.3595 202.566 36.1799C202.538 41.0633 202.566 48.4389 202.566 48.4389C202.566 48.606 202.633 48.7663 202.751 48.8844C202.869 49.0026 203.029 49.069 203.196 49.069H208.622C208.789 49.069 208.949 49.0026 209.067 48.8844C209.185 48.7663 209.252 48.606 209.252 48.4389V34.9212C209.252 27.6749 207.505 24.5526 202.568 23.6515" fill="currentColor"></path><path d="M259.138 17.4449C259.225 17.4388 259.311 17.4506 259.393 17.4796C259.475 17.5085 259.549 17.554 259.613 17.6131C259.676 17.6722 259.726 17.7437 259.761 17.8232C259.795 17.9027 259.813 17.9884 259.813 18.075V46.3831C259.813 47.6686 259.269 48.1301 257.922 48.3775C254.951 48.8327 251.949 49.065 248.943 49.0722C239.241 49.0722 237.248 46.4036 237.248 36.2492C237.248 26.0948 239.255 23.3318 248.236 23.3318C249.877 23.2852 251.519 23.3748 253.146 23.5996V18.1112C253.142 18.026 253.155 17.9408 253.185 17.8609C253.215 17.781 253.261 17.7079 253.32 17.6462C253.378 17.5845 253.449 17.5354 253.528 17.5018C253.606 17.4683 253.691 17.4511 253.776 17.4512H259.16L259.138 17.4449ZM249.066 29.1541C244.507 29.1541 243.916 30.3718 243.916 36.202C243.916 41.5312 244.28 43.2908 248.792 43.2908C250.241 43.2893 251.689 43.184 253.124 42.9758V29.1541H249.06H249.066Z" fill="currentColor"></path><path d="M64.2297 31.0649V45.7656C64.2297 47.4496 63.9887 48.0624 61.5343 48.42C58.703 48.8207 55.8479 49.0312 52.9883 49.0501C46.2146 49.0501 42.6465 48.3286 42.5583 41.2398C42.6481 35.1402 45.8113 33.8359 51.8132 33.8359H57.5473V32.2007C57.5473 30.0347 56.1925 29.0863 53.305 29.0863H45.1245C45.0383 29.0852 44.9532 29.0666 44.8744 29.0318C44.7955 28.9969 44.7245 28.9465 44.6657 28.8835C44.6068 28.8205 44.5613 28.7463 44.5319 28.6653C44.5024 28.5843 44.4897 28.4982 44.4943 28.4121V24.7054C44.4901 24.5281 44.5524 24.3557 44.6691 24.2221C44.7857 24.0886 44.9482 24.0036 45.1245 23.9839C47.8206 23.4882 50.5594 23.2624 53.3003 23.3097C62.2385 23.3097 64.2265 26.1972 64.2265 31.0791M52.3519 38.1679C50.0079 38.1679 49.1887 38.9383 49.1887 40.8774C49.1887 43.0435 50.1796 43.6342 53.0262 43.6342C54.544 43.6442 56.0586 43.4921 57.5441 43.1805V38.1679H52.3519Z" fill="currentColor"></path><path d="M76.6021 28.7618H85.994C86.0798 28.7594 86.1643 28.7399 86.2425 28.7047C86.3207 28.6694 86.3912 28.6189 86.4498 28.5562C86.5084 28.4935 86.554 28.4198 86.5839 28.3394C86.6138 28.2589 86.6275 28.1733 86.6241 28.0876V24.4093C86.6093 24.2197 86.5198 24.0437 86.3754 23.92C86.231 23.7963 86.0434 23.7349 85.8538 23.7492C84.3069 23.5917 82.2023 23.4263 79.6928 23.3507C78.9572 23.316 76.7643 23.3018 76.5028 23.3018C70.7688 23.3018 66.8841 24.6566 66.8841 29.896V30.6175C66.7176 32.1302 67.1073 33.6518 67.9804 34.8983C68.8535 36.1447 70.1503 37.0309 71.6289 37.3913C71.6289 37.3913 78.0167 39.6802 78.2231 39.7637C79.2202 40.2583 79.5778 40.8018 79.5778 41.4965V41.9502C79.5778 43.0781 78.6768 43.5728 76.9171 43.5728H67.5268C67.4402 43.5743 67.3548 43.5934 67.2757 43.6287C67.1966 43.6641 67.1255 43.7151 67.0667 43.7787C67.0078 43.8423 66.9624 43.9171 66.9332 43.9986C66.904 44.0802 66.8916 44.1668 66.8967 44.2533V47.9111C66.8967 48.1317 67.0337 48.5413 67.667 48.5854C69.2139 48.7429 71.3185 48.9083 73.828 48.9839C74.5636 49.0186 76.7565 49.0328 77.018 49.0328C82.752 49.0328 86.6367 47.678 86.6367 42.4386V41.7171C86.8032 40.2044 86.4135 38.6828 85.5404 37.4363C84.6673 36.1898 83.3705 35.3037 81.8919 34.9433C81.8919 34.9433 75.5041 32.6544 75.2977 32.5709C74.3006 32.0762 73.943 31.5328 73.943 30.8381V30.3749C73.943 29.247 74.8441 28.746 76.6037 28.746" fill="currentColor"></path><path d="M98.7933 28.7618H108.185C108.271 28.7594 108.355 28.7399 108.434 28.7047C108.512 28.6694 108.582 28.6189 108.641 28.5562C108.7 28.4935 108.745 28.4198 108.775 28.3394C108.805 28.2589 108.819 28.1733 108.815 28.0876V24.4093C108.8 24.2197 108.711 24.0437 108.567 23.92C108.422 23.7963 108.235 23.7349 108.045 23.7492C106.498 23.5917 104.394 23.4263 101.884 23.3507C101.148 23.316 98.9556 23.3018 98.6941 23.3018C92.96 23.3018 89.0753 24.6566 89.0753 29.896V30.6175C88.9088 32.1302 89.2985 33.6518 90.1716 34.8983C91.0447 36.1447 92.3416 37.0309 93.8201 37.3913C93.8201 37.3913 100.208 39.6802 100.414 39.7637C101.411 40.2583 101.769 40.8018 101.769 41.4965V41.9502C101.769 43.0781 100.868 43.5728 99.1084 43.5728H89.7164C89.6298 43.5743 89.5444 43.5934 89.4653 43.6287C89.3863 43.6641 89.3152 43.7151 89.2563 43.7787C89.1974 43.8423 89.1521 43.9171 89.1229 43.9986C89.0936 44.0802 89.0812 44.1668 89.0863 44.2533V47.9111C89.0863 48.1317 89.2234 48.5413 89.8566 48.5854C91.4036 48.7429 93.5082 48.9083 96.0176 48.9839C96.7533 49.0186 98.9461 49.0328 99.2076 49.0328C104.942 49.0328 108.826 47.678 108.826 42.4386V41.7171C108.993 40.2044 108.603 38.6828 107.73 37.4363C106.857 36.1898 105.56 35.3037 104.082 34.9433C104.082 34.9433 97.6938 32.6544 97.4874 32.5709C96.4902 32.0762 96.1326 31.5328 96.1326 30.8381V30.3749C96.1326 29.247 97.0337 28.746 98.7933 28.746" fill="currentColor"></path><path d="M134.345 23.316C132.106 23.1876 129.868 23.5785 127.806 24.4581C125.75 23.5559 123.506 23.164 121.267 23.316C113.181 23.316 111.386 25.7987 111.386 34.132V48.4137C111.386 48.5808 111.453 48.7411 111.571 48.8592C111.689 48.9774 111.849 49.0438 112.016 49.0438H117.428C117.594 49.0413 117.753 48.9742 117.87 48.8565C117.988 48.7389 118.055 48.58 118.058 48.4137V35.8444C118.058 30.3781 118.573 29.3195 121.262 29.1194C123.765 29.3053 124.384 30.2394 124.46 34.7905V48.4042C124.466 48.5709 124.536 48.7289 124.655 48.846C124.773 48.9631 124.932 49.0304 125.099 49.0343H130.51C130.678 49.0343 130.838 48.9679 130.956 48.8498C131.074 48.7316 131.141 48.5713 131.141 48.4042V34.7921C131.216 30.2331 131.835 29.299 134.338 29.1131C137.027 29.3132 137.543 30.3733 137.543 35.8381V48.4074C137.543 48.5745 137.609 48.7348 137.727 48.8529C137.845 48.9711 138.006 49.0375 138.173 49.0375H143.584C143.75 49.0354 143.909 48.9684 144.027 48.8507C144.145 48.7329 144.212 48.5738 144.214 48.4074V34.1257C144.214 25.7924 142.461 23.3097 134.334 23.3097" fill="currentColor"></path></g><defs><clipPath id="clip0_2_90"><rect width="270.951" height="60" fill="white"></rect></clipPath></defs></svg></a></div></div></footer><div id="modal-portal"></div></div><script id="__NEXT_DATA__" type="application/json" nonce="yDbYXrHWqbb0aE791ltPpjJK6iCdKLQELYnbR3u3qqQ=">{"props":{"pageProps":{"article":{"id":347246,"postType":"Article","title":"bun testが速いのでvitestから置き換えたらめちゃ高速化された","slug":"c5207260e90e8c","commentsCount":0,"likedCount":273,"bookmarkedCount":0,"bodyLettersCount":2853,"articleType":"tech","emoji":"⚡","isSuspendingPrivate":false,"publishedAt":"2024-12-17T10:15:58.335+09:00","bodyUpdatedAt":"2024-12-17T10:14:07.996+09:00","sourceRepoUpdatedAt":null,"pinned":false,"path":"/studio/articles/c5207260e90e8c","bodyHtml":"\u003ch2 id=\"%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91\" data-line=\"0\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91\" aria-hidden=\"true\"\u003e\u003c/a\u003e きっかけ\u003c/h2\u003e\n\u003cul data-line=\"2\" class=\"code-line\"\u003e\n\u003cli data-line=\"2\" class=\"code-line\"\u003eユニットテストはvitestを使ってます\u003c/li\u003e\n\u003cli data-line=\"3\" class=\"code-line\"\u003eまあ十分速い\u003c/li\u003e\n\u003cli data-line=\"4\" class=\"code-line\"\u003eでもCIで全testを回すとけっこう時間がかかる\u003c/li\u003e\n\u003cli data-line=\"5\" class=\"code-line\"\u003ebunのtestが速いらしい。置き換えよう\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E7%B5%90%E6%9E%9C\" data-line=\"7\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E7%B5%90%E6%9E%9C\" aria-hidden=\"true\"\u003e\u003c/a\u003e 置き換えた結果\u003c/h2\u003e\n\u003ch3 id=\"before-(vitest)\" data-line=\"9\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#before-(vitest)\" aria-hidden=\"true\"\u003e\u003c/a\u003e before (vitest)\u003c/h3\u003e\n\u003cp data-line=\"11\" class=\"code-line\"\u003e\u003cimg src=\"https://storage.googleapis.com/zenn-user-upload/1eca99ff375c-20241217.png\" loading=\"lazy\" class=\"md-img\"\u003e\u003c/p\u003e\n\u003cul data-line=\"13\" class=\"code-line\"\u003e\n\u003cli data-line=\"13\" class=\"code-line\"\u003e1000弱のtestを回すのに2分44秒かかってた\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"after-(bun-%2B-vitest)\" data-line=\"15\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#after-(bun-%2B-vitest)\" aria-hidden=\"true\"\u003e\u003c/a\u003e after (bun + vitest)\u003c/h3\u003e\n\u003cp data-line=\"17\" class=\"code-line\"\u003e\u003cimg src=\"https://storage.googleapis.com/zenn-user-upload/b14158ecb628-20241217.png\" loading=\"lazy\" class=\"md-img\"\u003e\u003c/p\u003e\n\u003cul data-line=\"19\" class=\"code-line\"\u003e\n\u003cli data-line=\"19\" class=\"code-line\"\u003e9割方のtestをbunで実行して2秒。速すぎる\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-line=\"21\" class=\"code-line\"\u003e\u003cimg src=\"https://storage.googleapis.com/zenn-user-upload/72c9d3334d87-20241217.png\" loading=\"lazy\" class=\"md-img\"\u003e\u003c/p\u003e\n\u003cul data-line=\"23\" class=\"code-line\"\u003e\n\u003cli data-line=\"23\" class=\"code-line\"\u003ebunに移行が難しかった一部だけvitestで実行して7秒\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"bun%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%AA%E3%81%AE%EF%BC%9F\" data-line=\"25\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#bun%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%AA%E3%81%AE%EF%BC%9F\" aria-hidden=\"true\"\u003e\u003c/a\u003e bunってどうなの?\u003c/h2\u003e\n\u003cp data-line=\"27\" class=\"code-line\"\u003e\u003cspan class=\"embed-block zenn-embedded zenn-embedded-card\"\u003e\u003ciframe id=\"zenn-embedded__c62de34749669\" src=\"https://embed.zenn.studio/card#zenn-embedded__c62de34749669\" data-content=\"https%3A%2F%2Fbun.sh%2F\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\"\u003e\u003c/iframe\u003e\u003c/span\u003e\u003ca href=\"https://bun.sh/\" style=\"display:none\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003ehttps://bun.sh/\u003c/a\u003e\u003c/p\u003e\n\u003cul data-line=\"29\" class=\"code-line\"\u003e\n\u003cli data-line=\"29\" class=\"code-line\"\u003eどうなんですかね?\u003c/li\u003e\n\u003cli data-line=\"30\" class=\"code-line\"\u003e\n\u003ca href=\"https://2024.stateofjs.com/en-US/libraries/testing/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003eState of JavaScript 2024: Testing\u003c/a\u003e によればother testing toolsの中では3位でした\u003c/li\u003e\n\u003cli data-line=\"31\" class=\"code-line\"\u003e\n\u003ccode\u003eDevelop, test, run, and bundle\u003c/code\u003e ができるオールインワンツールですが、今回はこのtestの部分だけ使うことにしました\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"bun-run-test%E3%81%A8bun-test%E3%81%AE%E9%81%95%E3%81%84\" data-line=\"33\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#bun-run-test%E3%81%A8bun-test%E3%81%AE%E9%81%95%E3%81%84\" aria-hidden=\"true\"\u003e\u003c/a\u003e bun run testとbun testの違い\u003c/h2\u003e\n\u003cul data-line=\"35\" class=\"code-line\"\u003e\n\u003cli data-line=\"35\" class=\"code-line\"\u003eとりあえず \u003ccode\u003ebun test\u003c/code\u003e を実行してみたらけっこうエラーが出て全然ダメでした\u003c/li\u003e\n\u003cli data-line=\"36\" class=\"code-line\"\u003eで、\u003ca href=\"https://vitest.dev/guide/#writing-tests\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003evitestのドキュメント\u003c/a\u003eを見ると \u003ccode\u003ebun run test\u003c/code\u003e 使ってねと書いてたのでそうしたら通りました。よかった\u003c/li\u003e\n\u003cli data-line=\"37\" class=\"code-line\"\u003e…と思ったけど全然速くなってない。これだとそもそもbunで実行されないので何も変わりません\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"bun%E3%81%A7%E5%8B%95%E3%81%8F%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B\" data-line=\"39\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#bun%E3%81%A7%E5%8B%95%E3%81%8F%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e bunで動くようにする\u003c/h2\u003e\n\u003cul data-line=\"41\" class=\"code-line\"\u003e\n\u003cli data-line=\"41\" class=\"code-line\"\u003eエラーを見ていって順に直していきました\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"global-import%E3%82%92%E3%82%84%E3%82%81%E3%82%8B\" data-line=\"43\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#global-import%E3%82%92%E3%82%84%E3%82%81%E3%82%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e global importをやめる\u003c/h3\u003e\n\u003cul data-line=\"45\" class=\"code-line\"\u003e\n\u003cli data-line=\"45\" class=\"code-line\"\u003eこれjest時代から引きずってたんですが、\u003ccode\u003eexpect\u003c/code\u003eや\u003ccode\u003etest\u003c/code\u003eなどのAPIをグローバルimportしていてbunはそれを解釈しないのでエラーになってました\u003c/li\u003e\n\u003cli data-line=\"46\" class=\"code-line\"\u003evitest.configのglobalsを無効化し、各testファイルで明示的にimportするようにして解消しました\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dom-test\" data-line=\"48\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#dom-test\" aria-hidden=\"true\"\u003e\u003c/a\u003e dom test\u003c/h3\u003e\n\u003cul data-line=\"50\" class=\"code-line\"\u003e\n\u003cli data-line=\"50\" class=\"code-line\"\u003edom testが必要な場合、bunでは別途設定が必要です\u003c/li\u003e\n\u003cli data-line=\"51\" class=\"code-line\"\u003e\u003ca href=\"https://bun.sh/docs/test/dom\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003ehttps://bun.sh/docs/test/dom\u003c/a\u003e\u003c/li\u003e\n\u003cli data-line=\"52\" class=\"code-line\"\u003e\n\u003ccode\u003ehappy-dom\u003c/code\u003eを入れて設定ファイルを追加すればokです\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%82%E3%82%8Btest\" data-line=\"54\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%82%E3%82%8Btest\" aria-hidden=\"true\"\u003e\u003c/a\u003e タイムゾーンのあるtest\u003c/h3\u003e\n\u003cul data-line=\"56\" class=\"code-line\"\u003e\n\u003cli data-line=\"56\" class=\"code-line\"\u003edateをstring化した場合のtestなど実行環境のタイムゾーンによって結果が変わりますが、このへんvitestのものと違いが出ました\u003c/li\u003e\n\u003cli data-line=\"57\" class=\"code-line\"\u003eこれはtestファイル中に\u003ccode\u003eprocess.env.TZ = 'Asia/Tokyo'\u003c/code\u003eなどと指定すればokです\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"import%E5%85%83%E3%81%AF%E5%8B%9D%E6%89%8B%E3%81%ABbun%3Atest%E3%81%AB%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%82%8F%E3%82%8B\" data-line=\"60\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#import%E5%85%83%E3%81%AF%E5%8B%9D%E6%89%8B%E3%81%ABbun%3Atest%E3%81%AB%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%82%8F%E3%82%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e import元は勝手にbun:testに書き換わる\u003c/h3\u003e\n\u003cp data-line=\"62\" class=\"code-line\"\u003e\u003cspan class=\"embed-block zenn-embedded zenn-embedded-tweet\"\u003e\u003ciframe id=\"zenn-embedded__b09569d1aa7c\" src=\"https://embed.zenn.studio/tweet#zenn-embedded__b09569d1aa7c\" data-content=\"https%3A%2F%2Fx.com%2F__syumai%2Fstatus%2F1700160108053811342\" frameborder=\"0\" scrolling=\"no\" loading=\"lazy\"\u003e\u003c/iframe\u003e\u003c/span\u003e\u003ca href=\"https://x.com/__syumai/status/1700160108053811342\" style=\"display:none\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003ehttps://x.com/__syumai/status/1700160108053811342\u003c/a\u003e\u003c/p\u003e\n\u003cul data-line=\"64\" class=\"code-line\"\u003e\n\u003cli data-line=\"64\" class=\"code-line\"\u003e\n\u003ccode\u003eimport {} from 'vitest'\u003c/code\u003eと書いていても\u003ccode\u003ebun test\u003c/code\u003eで実行すると\u003ccode\u003evitest\u003c/code\u003eの部分が\u003ccode\u003ebun:test\u003c/code\u003eとして解釈されるので書き換えなくてもそのまま動きます\u003c/li\u003e\n\u003cli data-line=\"65\" class=\"code-line\"\u003eまあ最終的に\u003ccode\u003ebun:test\u003c/code\u003eに書き換えましたが\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"mock%E9%96%A2%E6%95%B0%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88\" data-line=\"67\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#mock%E9%96%A2%E6%95%B0%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88\" aria-hidden=\"true\"\u003e\u003c/a\u003e mock関数の置き換え\u003c/h3\u003e\n\u003cul data-line=\"69\" class=\"code-line\"\u003e\n\u003cli data-line=\"69\" class=\"code-line\"\u003eimport元は書き換えなくてもいいと書いたばかりですが、mock関数は互換性がないので書き換える必要がありました\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"code-block-container\"\u003e\u003cpre class=\"language-ts\"\u003e\u003ccode class=\"language-ts code-line\" data-line=\"71\"\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e vi \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efrom\u003c/span\u003e \u003cspan class=\"token template-string\"\u003e\u003cspan class=\"token template-punctuation string\"\u003e`\u003c/span\u003e\u003cspan class=\"token string\"\u003evitest\u003c/span\u003e\u003cspan class=\"token template-punctuation string\"\u003e`\u003c/span\u003e\u003c/span\u003e\nvi\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003efn\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\nvi\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003emock\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e'foo'\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"code-block-container\"\u003e\u003cpre class=\"language-ts\"\u003e\u003ccode class=\"language-ts code-line\" data-line=\"77\"\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e mock \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efrom\u003c/span\u003e \u003cspan class=\"token template-string\"\u003e\u003cspan class=\"token template-punctuation string\"\u003e`\u003c/span\u003e\u003cspan class=\"token string\"\u003ebun:test\u003c/span\u003e\u003cspan class=\"token template-punctuation string\"\u003e`\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"token function\"\u003emock\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\nmock\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003emodule\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e'foo'\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"bun%E3%81%A7%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%AA%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D%E3%82%82%E3%81%82%E3%82%8B\" data-line=\"83\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#bun%E3%81%A7%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%AA%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D%E3%82%82%E3%81%82%E3%82%8B\" aria-hidden=\"true\"\u003e\u003c/a\u003e bunで対応できてないところもある\u003c/h3\u003e\n\u003cul data-line=\"85\" class=\"code-line\"\u003e\n\u003cli data-line=\"85\" class=\"code-line\"\u003e\u003ca href=\"https://github.com/oven-sh/bun/issues/1825\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003ehttps://github.com/oven-sh/bun/issues/1825\u003c/a\u003e\u003c/li\u003e\n\u003cli data-line=\"86\" class=\"code-line\"\u003e現状では全部が全部対応してるわけじゃないです\u003c/li\u003e\n\u003cli data-line=\"87\" class=\"code-line\"\u003eあきらめましょう\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"%E3%81%98%E3%82%83%E3%81%82%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%8B%EF%BC%9F\" data-line=\"89\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%81%98%E3%82%83%E3%81%82%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%8B%EF%BC%9F\" aria-hidden=\"true\"\u003e\u003c/a\u003e じゃあどうするか?\u003c/h3\u003e\n\u003cul data-line=\"91\" class=\"code-line\"\u003e\n\u003cli data-line=\"91\" class=\"code-line\"\u003ebunとvitestは並列で回すようにしました\u003c/li\u003e\n\u003cli data-line=\"92\" class=\"code-line\"\u003e要はbunで実行するtestとvitestで実行するtestが切り分けられれば良いです\u003c/li\u003e\n\u003cli data-line=\"93\" class=\"code-line\"\u003etestファイルと認識されるのは\u003ccode\u003e*.test.ts\u003c/code\u003eや\u003ccode\u003e*.spec.ts\u003c/code\u003eですが、bun側にはマッチパターンをカスタムする設定が無いようなのでvitest側を変更しました\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"code-block-container\"\u003e\u003cpre class=\"language-js\"\u003e\u003ccode class=\"language-js code-line\" data-line=\"96\"\u003e\u003cspan class=\"token literal-property property\"\u003etest\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\n \u003cspan class=\"token literal-property property\"\u003einclude\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token string\"\u003e'**/*.vitest.?(c|m)[jt]s?(x)'\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\n\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul data-line=\"102\" class=\"code-line\"\u003e\n\u003cli data-line=\"102\" class=\"code-line\"\u003evitest.config.jsのtest.includeのところを\u003ccode\u003etest.ts\u003c/code\u003eではなく\u003ccode\u003evitest.ts\u003c/code\u003eに変更し、testファイルもそのようにリネームしました\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"%E5%91%A8%E8%BE%BA%E3%83%84%E3%83%BC%E3%83%AB\" data-line=\"104\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E5%91%A8%E8%BE%BA%E3%83%84%E3%83%BC%E3%83%AB\" aria-hidden=\"true\"\u003e\u003c/a\u003e 周辺ツール\u003c/h2\u003e\n\u003ch3 id=\"%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%8B%A1%E5%BC%B5\" data-line=\"106\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%8B%A1%E5%BC%B5\" aria-hidden=\"true\"\u003e\u003c/a\u003e エディタ拡張\u003c/h3\u003e\n\u003cul data-line=\"108\" class=\"code-line\"\u003e\n\u003cli data-line=\"108\" class=\"code-line\"\u003e\u003ca href=\"https://marketplace.visualstudio.com/items?itemName=oven.bun-vscode\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003ehttps://marketplace.visualstudio.com/items?itemName=oven.bun-vscode\u003c/a\u003e\u003c/li\u003e\n\u003cli data-line=\"109\" class=\"code-line\"\u003eVSCodeでbun用の拡張もあります\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp data-line=\"111\" class=\"code-line\"\u003e\u003cimg src=\"https://storage.googleapis.com/zenn-user-upload/a7f26e4cd255-20241217.png\" loading=\"lazy\" class=\"md-img\"\u003e\u003c/p\u003e\n\u003cul data-line=\"113\" class=\"code-line\"\u003e\n\u003cli data-line=\"113\" class=\"code-line\"\u003evitestの拡張と同じような感じで各testの上に実行ボタンが出ます\u003c/li\u003e\n\u003cli data-line=\"114\" class=\"code-line\"\u003evitestのほうは専用のUIパネルですが、bunのほうは統合ターミナルにコマンドを出力して実行するのでけっこう素朴な感じです。historyに積まれるのがちょっと面倒かも\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"%E3%83%84%E3%83%BC%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC\" data-line=\"116\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%83%84%E3%83%BC%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC\" aria-hidden=\"true\"\u003e\u003c/a\u003e ツールマネージャー\u003c/h3\u003e\n\u003cul data-line=\"118\" class=\"code-line\"\u003e\n\u003cli data-line=\"118\" class=\"code-line\"\u003eフロントエンドのツール管理は\u003ca href=\"https://volta.sh/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003evolta\u003c/a\u003eを使ってたんですが、bunは対応してない(pnpmも)ので置き換えることにしました\u003c/li\u003e\n\u003cli data-line=\"119\" class=\"code-line\"\u003e\n\u003ca href=\"https://mise.jdx.dev/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"\u003emise\u003c/a\u003eを使うといろいろ良さげだったのでそちらにしてます\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"%E3%81%BE%E3%81%A8%E3%82%81\" data-line=\"121\" class=\"code-line\"\u003e\n\u003ca class=\"header-anchor-link\" href=\"#%E3%81%BE%E3%81%A8%E3%82%81\" aria-hidden=\"true\"\u003e\u003c/a\u003e まとめ\u003c/h2\u003e\n\u003cul data-line=\"123\" class=\"code-line\"\u003e\n\u003cli data-line=\"123\" class=\"code-line\"\u003eほんと速い\u003c/li\u003e\n\u003cli data-line=\"124\" class=\"code-line\"\u003eproductionに使っていいのか?\n\u003cul data-line=\"125\" class=\"code-line\"\u003e\n\u003cli data-line=\"125\" class=\"code-line\"\u003eまあいいんじゃないですか\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n","ogImageUrl":"https://res.cloudinary.com/zenn/image/upload/s--3tX5vM0s--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:bun%2520test%25E3%2581%258C%25E9%2580%259F%25E3%2581%2584%25E3%2581%25AE%25E3%2581%25A7vitest%25E3%2581%258B%25E3%2582%2589%25E7%25BD%25AE%25E3%2581%258D%25E6%258F%259B%25E3%2581%2588%25E3%2581%259F%25E3%2582%2589%25E3%2582%2581%25E3%2581%25A1%25E3%2582%2583%25E9%25AB%2598%25E9%2580%259F%25E5%258C%2596%25E3%2581%2595%25E3%2582%258C%25E3%2581%259F%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_34:miyaoka%2Cx_220%2Cy_108/bo_3px_solid_rgb:d6e3ed%2Cg_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2UwYmNhNWZkODEuanBlZw==%2Cr_20%2Cw_90%2Cx_92%2Cy_102/co_rgb:6e7b85%2Cg_south_west%2Cl_text:notosansjp-medium.otf_30:Studio%2520Tech%2520Blog%2Cx_220%2Cy_160/bo_4px_solid_white%2Cg_south_west%2Ch_50%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2FlYTU4ZTc5ZDAuanBlZw==%2Cr_max%2Cw_50%2Cx_139%2Cy_84/v1627283836/default/og-base-w1200-v2.png","toc":[{"id":"%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91","text":"きっかけ","level":2,"children":[]},{"id":"%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E7%B5%90%E6%9E%9C","text":"置き換えた結果","level":2,"children":[{"id":"before-(vitest)","text":"before (vitest)","level":3,"children":[]},{"id":"after-(bun-%2B-vitest)","text":"after (bun + vitest)","level":3,"children":[]}]},{"id":"bun%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%AA%E3%81%AE%EF%BC%9F","text":"bunってどうなの?","level":2,"children":[]},{"id":"bun-run-test%E3%81%A8bun-test%E3%81%AE%E9%81%95%E3%81%84","text":"bun run testとbun testの違い","level":2,"children":[]},{"id":"bun%E3%81%A7%E5%8B%95%E3%81%8F%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B","text":"bunで動くようにする","level":2,"children":[{"id":"global-import%E3%82%92%E3%82%84%E3%82%81%E3%82%8B","text":"global importをやめる","level":3,"children":[]},{"id":"dom-test","text":"dom test","level":3,"children":[]},{"id":"%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E3%81%AE%E3%81%82%E3%82%8Btest","text":"タイムゾーンのあるtest","level":3,"children":[]},{"id":"import%E5%85%83%E3%81%AF%E5%8B%9D%E6%89%8B%E3%81%ABbun%3Atest%E3%81%AB%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%82%8F%E3%82%8B","text":"import元は勝手にbun:testに書き換わる","level":3,"children":[]},{"id":"mock%E9%96%A2%E6%95%B0%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88","text":"mock関数の置き換え","level":3,"children":[]},{"id":"bun%E3%81%A7%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%AA%E3%81%84%E3%81%A8%E3%81%93%E3%82%8D%E3%82%82%E3%81%82%E3%82%8B","text":"bunで対応できてないところもある","level":3,"children":[]},{"id":"%E3%81%98%E3%82%83%E3%81%82%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%8B%EF%BC%9F","text":"じゃあどうするか?","level":3,"children":[]}]},{"id":"%E5%91%A8%E8%BE%BA%E3%83%84%E3%83%BC%E3%83%AB","text":"周辺ツール","level":2,"children":[{"id":"%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%8B%A1%E5%BC%B5","text":"エディタ拡張","level":3,"children":[]},{"id":"%E3%83%84%E3%83%BC%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC","text":"ツールマネージャー","level":3,"children":[]}]},{"id":"%E3%81%BE%E3%81%A8%E3%82%81","text":"まとめ","level":2,"children":[]}],"tocEnabled":true,"shouldNoindex":false,"scheduledPublishAt":null,"canSendBadge":true,"status":"published","badges":[]},"user":{"id":1415,"username":"miyaoka","name":"miyaoka","avatarSmallUrl":"https://res.cloudinary.com/zenn/image/fetch/s--77D6N5AC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/aea58e79d0.jpeg","avatarUrl":"https://storage.googleapis.com/zenn-user-upload/avatar/aea58e79d0.jpeg","bio":"Software Engineer","autolinkedBio":"Software Engineer","githubUsername":"miyaoka","twitterUsername":"miyaoka","isSupportOpen":true,"tokusyoContact":null,"tokusyoName":null,"websiteUrl":"","websiteDomain":null,"totalLikedCount":518,"gaTrackingId":"G-V6XYTKELYB","hatenaId":null,"isInvoiceIssuer":false},"topics":[{"id":196,"name":"test","taggingsCount":1644,"imageUrl":"https://storage.googleapis.com/zenn-user-upload/topics/902109da93.jpeg","displayName":"Test"},{"id":9853,"name":"bun","taggingsCount":287,"imageUrl":"https://storage.googleapis.com/zenn-user-upload/topics/01fdf43e63.png","displayName":"Bun"},{"id":11092,"name":"vitest","taggingsCount":252,"imageUrl":"https://storage.googleapis.com/zenn-user-upload/topics/d00dc48de6.png","displayName":"Vitest"}],"isMine":false,"isPreview":false,"draftRevealScope":"private","githubRepository":null,"currentUserLiked":false,"currentUserBookmarked":false,"comments":[],"commentedUsers":[],"positiveCommentsCount":0,"publication":{"id":130,"name":"studio","displayName":"Studio Tech Blog","avatarSmallUrl":"https://res.cloudinary.com/zenn/image/fetch/s--mTNkMctR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_80/https://storage.googleapis.com/zenn-user-upload/avatar/e0bca5fd81.jpeg","avatarUrl":"https://storage.googleapis.com/zenn-user-upload/avatar/e0bca5fd81.jpeg","pro":false,"avatarRegistered":true,"description":"Web制作を、ノーコードで。\nノーコードWeb制作プラットフォーム「Studio」開発で培った技術的な知見を投稿します。\nUnleash Creativity.","autolinkedDescription":"Web制作を、ノーコードで。\nノーコードWeb制作プラットフォーム「Studio」開発で培った技術的な知見を投稿します。\nUnleash Creativity.","twitterUsername":"","githubUsername":"","coverImageUrl":"https://storage.googleapis.com/zenn-user-upload/publication_cover/a76c842526.jpeg","fixedSentencesHtml":null,"isSupportOpen":true,"isArticleCommentOpen":true,"gaTrackingId":null}}},"page":"/[username]/articles/[slug]","query":{"username":"studio","slug":"c5207260e90e8c"},"buildId":"8XDX_1Wb7xPMW2Ir_tENg","assetPrefix":"https://static.zenn.studio","isFallback":false,"isExperimentalCompile":false,"dynamicIds":[80529],"gip":true,"scriptLoader":[]}</script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10