Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
VitestのIn-Source Testingが便利
Search
taro
April 23, 2025
Programming
3.4k
11
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
VitestのIn-Source Testingが便利
Mita.ts #5
https://mitats.connpass.com/event/340678/
での登壇資料です。
taro
April 23, 2025
More Decks by taro
See All by taro
ローコードサービスの進化のためのモノレポ移行
taro28
2
580
ローコードSaaSのUXを向上させるためのTypeScript
taro28
2
1.3k
GraphQLをServer Componentsで使いたい
taro28
8
3.2k
Sequenceを理解する
taro28
1
340
propsのバケツリレー対策でGlobal_Stateを使うその前に
taro28
12
5k
状態ってなに?🙃
taro28
2
630
ReactのSuspenseを使った非同期処理のエラーハンドリング
taro28
9
7.4k
一口目から美味しいReactのスルメ本🦑
taro28
3
1.6k
T-falってすごい【社内LT】
taro28
1
400
Other Decks in Programming
See All in Programming
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
130
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
180
共通化で考えるべきは、実装より公開する型だった
codeegg
0
130
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
7
3.3k
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
160
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
Creating Composable Callables in Contemporary C++
rollbear
0
200
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
110
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
200
symfony/aiとlaravel/boost
77web
0
120
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
130
Featured
See All Featured
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
Embracing the Ebb and Flow
colly
88
5.1k
4 Signs Your Business is Dying
shpigford
187
22k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Documentation Writing (for coders)
carmenintech
77
5.4k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
220
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
220
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Docker and Python
trallard
47
3.9k
We Are The Robots
honzajavorek
0
270
Marketing to machines
jonoalderson
1
5.6k
For a Future-Friendly Web
brad_frost
183
10k
Transcript
VitestのIn-Source Testingが便利 2025-04-23 Mita.ts #5 taro(@taroro_tarotaro)
自己紹介 taro(@taroro_tarotaro) ベースマキナのソフトウェアエンジニア TypeScript, Go, GraphQL, etc.
目次 VitestのIn-Source Testingとは 嬉しいポイント テストのためのexportが不要になる プライベート関数にテストが書ける AIとの相性が良い まとめ
VitestのIn-Source Testingとは その名の通り、実装と同じファイルにテストが書けるやつ export function add(...args: number[]) { return args.reduce((a,
b) => a + b, 0); } // ソースコード内にテストが書ける if (import.meta.vitest) { it("add", () => { expect(add()).toBe(0); expect(add(1)).toBe(1); expect(add(1, 2, 3)).toBe(6); }); } https://vitest.dev/guide/in-source
VitestのIn-Source Testingとは わりと普通に動く 各種vitestの関数 Snapshotテスト モック
嬉しいポイント
テストのためのexportが不要になる テストのために関数をexportしてコメントを書く… // export for test export const swap =
<T>(data: T[], i: number, j: number) => { // data のi 番目とj 番目を入れ替える処理 // ... }; import { swap } from "./swap"; describe("swap", () => { it("basic", () => { expect(swap(["a", "b", "c"], 0, 1)).toEqual(["b", "a", "c"]); }); it("out of range", () => { // ...
テストのためのexportが不要になる テストのためのexportが不要! const swap = <T>(data: T[], i: number, j:
number) => { // data のi 番目とj 番目を入れ替える処理 // ... }; if (import.meta.vitest) { it("swap: basic", () => { expect(swap(["a", "b", "c"], 0, 1)).toEqual(["b", "a", "c"]); }); it("swap: out of range", () => { // ... } const useSwap = (initialData: Props) => {
テストのためのexportが不要になる テストのために定数をexport… // export for test export const userStatus =
{ // ... } as const; export const checkUserStatus = (user: User): UserStatus => { if (user.lastLoggedIn === null) { return userStatus.NEW; } if (user.lastLoggedIn > 30) { return userStatus.ACTIVE; } return userStatus.INACTIVE; };
テストのためのexportが不要になる テストのための定数や型などのexportが不要になる! const userStatus = { // ... } as
const; export const checkUserStatus = (user: User): UserStatus => { // ... }; if (import.meta.vitest) { describe("checkUserStatus", () => { test.each([ // テスト内で定数が使える! { lastLoggedIn: null, expected: userStatus.NEW }, // ...
プライベートな関数にテストが書ける const swap = <T>(data: T[], i: number, j: number)
=> { // data のi 番目とj 番目を入れ替える処理 }; const useSwap = (initialData: Props) => { // swap 関数を使って、データを入れ替える }; export const Swapper: FC<Props> = (initialData) => { const { data, swapData } = useSwap(initialData); // ... }; exportしている関数やコンポーネントに、まとめて全てのケースのテストを書く… describe("Swapper", () => { // ...
プライベートな関数にテストが書ける プライベートな関数に細かくテストを書ける! const swap = <T>(data: T[], i: number, j:
number) => { // data のi 番目とj 番目を入れ替える処理 // ... }; if (import.meta.vitest) { it("swap: basic", () => { expect(swap(["a", "b", "c"], 0, 1)).toEqual(["b", "a", "c"]); }); it("swap: out of range", () => { // ... } const useSwap = (initialData: Props) => {
プライベートな関数にテストが書ける 条件分岐で色んな関数を呼ぶ関数に全てのケースのテストを書く… export const dataConverter = (data: Data) => {
switch (data.type) { case "type1": return convertType1(data); case "type2": return convertType2(data); // ... } }; describe("dataConverter", () => { // 全てのtype のテストをdataConverter に対して書く… // ... });
プライベートな関数にテストが書ける プライベートな関数に細かくテストを書ける! const convertType1 = (data: Data) => { //
... if (import.meta.vitest) { it("convertType1", () => { // ... }); } // ... // この関数のテストは薄くできる! export const dataConverter = (data: Data) => { switch (data.type) { case "type1": return convertType1(data); // ...
AIとの相性が良い(気がする) AI Agentを使っていると、特に指示しなくてもテストに気づくことが多い(気がする) テストの内容も情報源として、実装をしてくれる(気がする) テストの修正を指示しなくていい(気がする)
AIとの相性が良い(気がする) AI Agentを使っていると、特に指示しなくてもテストに気づくことが多い(気がする) テストの内容も情報源として、実装をしてくれる(気がする) テストの修正を指示しなくていい(気がする) AIが理解しやすいってことは人間も理解しやすいはず…!
まとめ テストのためのexportが不要になる プライベートな関数にテストが書ける AIとの相性が良い(気がする)
ぜひIn-Source Testing使って みてください!