๐ AI-Powered Jest ํ ์คํธ ์ผ์ด์ค ์์ฑ๊ธฐ ๊ตฌ์ถ (TypeScript์ฉ)
Source: Dev.to
์์ ์ ๊ณต๋ ์์ค ๋งํฌ๋ง์ผ๋ก๋ ๋ฒ์ญํ ๋ณธ๋ฌธ ๋ด์ฉ์ด ์์ต๋๋ค. ๋ฒ์ญ์ด ํ์ํ ์ ์ฒด ํ ์คํธ๋ฅผ ์ ๊ณตํด ์ฃผ์๋ฉด, ์์ฒญํ์ ๋๋ก ์์ค ๋งํฌ๋ ๊ทธ๋๋ก ์ ์งํ๊ณ ๋งํฌ๋ค์ด ํ์๊ณผ ์ฝ๋ ๋ธ๋ก, URL ๋ฑ์ ๊ทธ๋๋ก ๋ณด์กดํ๋ฉด์ ํ๊ตญ์ด๋ก ๋ฒ์ญํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ ๋ ํ ์คํธ ์์ฑ์ ๋ชจ๋ฒ ์ฌ๋ก์ด์ง๋ง, ๋ง์ ๊ฐ๋ฐ์์๊ฒ๋ ๋ฐ๋ณต์ ์ด๊ณ ์๊ฐ ์๋ชจ๊ฐ ํฌ๋ฉฐ ํ๋ก์ ํธ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ์ฐ์ ์์์์ ๋ฐ๋ฆฌ๊ธฐ ์ฝ์ต๋๋ค.
TypeScript ๋ฐฑ์๋ ํ๋ก์ ํธ์์ Jest ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋๊ฒ ์ ์งํ๋ ค๋ฉด ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ๊ธฐ๋ณด๋ค ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์๋นํ ์๊ฐ์ ํฌ์ํด์ผ ํฉ๋๋ค.
ํด๊ฒฐ์ฑ
์ ๋ **ts-genai-test**๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ด๋ TypeScript (Node.js)์ฉ AIโ๊ธฐ๋ฐ Jest ํ
์คํธโ์ผ์ด์ค ์์ฑ๊ธฐ๋ก, ๊ตฌ์ฑ ๊ฐ๋ฅํ ์์ฑโAI ์ ๊ณต์๋ฅผ ์ฌ์ฉํด ์๋ฏธ ์๋ ์ ๋ ํ
์คํธ๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
- GitHub:
- npm:
๐ง ๋ฌธ์
- ๋ฐ๋ณต์ ์ธ Jest ๋ณด์ผ๋ฌํ๋ ์ดํธ ์์ฑ
- ์๊ฐ ์๋ฐ์ผ๋ก ์ธํ ๊ฒฝ๊ณ ์ฌ๋ก ๋๋ฝ
- ๋ฆฌํฉํฐ๋ง ํ ํ ์คํธ๊ฐ ์ค๋๋จ
- ์ฝ๋ฉ๋ณด๋ค ํ ์คํธ์ ๋ ๋ง์ ์๊ฐ ์์
๐ค ts-genai-test๋?
ts-genai-test๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ๋๊ตฌ์
๋๋ค:
- Jest ๋จ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค
- TypeScript (Node.js) ํ๋ก์ ํธ์ ํธํ๋ฉ๋๋ค
- ์ฌ๋ฌ AI ์ ๊ณต์๋ฅผ ์ง์ํฉ๋๋ค
- ๋ชจ๋ธ ์ด๋ฆ ๋ฐ API ํค๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค
- ๋ฐ๋ก ์คํ ๊ฐ๋ฅํ
.test.tsํ์ผ์ ์์ฑํฉ๋๋ค - CI/CD ์ํฌํ๋ก์ ๊น๋ํ๊ฒ ํตํฉ๋๋๋ก ์ค๊ณ๋์์ต๋๋ค
์ด ํ๋ก์ ํธ๋ TypeScript๋ก ์์ฑ๋์์ผ๋ฉฐ pnpm์ผ๋ก ํจํค์ง๋๊ณ , ๋จ์ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ๊ฐ๋ฐ์ ์นํ์ ์ธ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
โจ ์ฃผ์ ๊ธฐ๋ฅ
โ AIโ์์ฑ Jest ํ ์คํธ ์ผ์ด์ค
ํด์ TypeScript ํ์ผ์ด๋ ํจ์์ ์ง์ ํ๋ฉด Jest ํ ์คํธ ์ผ์ด์ค๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
import path from "path";
import { generateTests, functionalTypes } from "ts-genai-test";
const inputPrompt: functionalTypes.PromptInput[] = [
{
outputTestDir: path.resolve(__dirname, "../__tests__"), // ์ ํ ์ฌํญ, ๊ธฐ๋ณธ๊ฐ์ 'tests' ํด๋
folderPath: path.resolve(__dirname, "../src"), // ์์ค ํด๋
filePath: path.resolve(__dirname, "../src/index"), // ์์ค ํ์ผ
functionName: "add", // ํ
์คํธ๋ฅผ ์์ฑํ ํจ์
testFileName: "", // ์ ํ ์ฌํญ, ์ฌ์ฉ์ ์ง์ ํ
์คํธ ํ์ผ๋ช
rootPath: "" // outputTestDir๋ฅผ ์ ๊ณตํ์ง ์์ ๊ฒฝ์ฐ ํ์
}
];
await generateTests(inputPrompt);
์์ฑ๋ ์ถ๋ ฅ์ ๊น๋ํ๊ณ ๊ฐ๋ ์ฑ์ด ๋์ผ๋ฉฐ ๋ฐ๋ก ์คํํ ์ ์์ต๋๋คโ์๋ ์ ๋ฆฌ๊ฐ ์ ํ ํ์ ์์ต๋๋ค.
๐งฉ ๊ธฐ์กด ํ ์คํธ ์ผ์ด์ค ๋ฎ์ด์ฐ๊ธฐ (ํ๋๊ทธ ๊ธฐ๋ฐ ์ ์ด)
๊ธฐ๋ณธ์ ์ผ๋ก ts-genai-test๋ ๊ธฐ์กด ํ
์คํธ ํ์ผ์ ๋ณด์กดํ์ฌ ์ค์๋ก ๋ฎ์ด์ฐ๋ ์ผ์ ๋ฐฉ์งํฉ๋๋ค. override ํ๋๊ทธ๋ฅผ ํ์ฑํํ๋ฉด:
- ๊ธฐ์กด
.test.tsํ์ผ์ ๋ช ์์ ์ผ๋ก ๋ฎ์ด์ - ์ด์ ์ ์์ฑํ๊ฑฐ๋ ์๋์ผ๋ก ์์ฑํ ํ ์คํธ๋ฅผ ์๋ก ์์ฑ๋ ํ ์คํธ๋ก ๊ต์ฒด ๊ฐ๋ฅ
- ๊ฐ๋ฐ์๋ ์ฌ์์ฑ ์์ ์ ์์ ํ ์ ์ดํ ์ ์์
์ด์ ๊ฐ์ ์๋์ ์ด๊ณ ๋ช ์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์์น ์๋ ๋ณ๊ฒฝ ์ํ์ ์ค์ด๋ฉด์๋ ์ฌ์์ฑ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
โ๏ธ ํญ๋๊ณ ์ ์ฐํ AI ์ค์
๋ชจ๋ธ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ๊ฒฝ ๋ณ์๋ก ์ค์ ํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค:
| ๋ณ์ | ์ค๋ช |
|---|---|
AI_PROVIDER | AI ์ ๊ณต์ (์: openai, gemini, groq) |
AI_MODEL_NAME | ๋ชจ๋ธ ์ฝ๋ ๋๋ ์ด๋ฆ (์: gemini-2.5-flash) |
AI_API_KEY | ์ ๊ณต์ API ํค |
AI_RETRY_COUNT | ์คํจํ AI ํธ์ถ์ ๋ํ ์ฌ์๋ ํ์ |
์ด ์ ์ฐ์ฑ์ ํตํด ํ์ ์ ๊ณต์๋ฅผ ์ ํํ๊ณ ๋น์ฉ์ ์ ์ดํ๋ฉฐ ์ํฌํ๋ก์ฐ๋ฅผ ๋ฏธ๋์ ๋๋น์ํฌ ์ ์์ต๋๋ค.
๐ ๋ด์ฅ ์ฌ์๋ ๋ฉ์ปค๋์ฆ
๋คํธ์ํฌ ๋ฌธ์ ๋ ๋ถ์์ ํ ์๋ต์ผ๋ก AI ํธ์ถ์ด ์คํจํ ์ ์์ต๋๋ค. ts-genai-test๋ ํ ๋ฒ์ ์ฌ์๋ ๋ฉ์ปค๋์ฆ์ ํฌํจํ๊ณ ์์ด, ์คํจํ๊ธฐ ์ ์ ์ฌ์์ฑ์ ์๋ํฉ๋๋คโCI ํ์ดํ๋ผ์ธ๊ณผ ๊ฐ์ ์๋ํ ํ๊ฒฝ์์๋ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ ์๋ ํ ์คํธ ๋๋ ํฐ๋ฆฌ ์ฒ๋ฆฌ
๋์ ํ ์คํธ ๋๋ ํฐ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ, ํด์ด ์๋์ผ๋ก ์์ฑํ์ฌ ์ค์ ๋ง์ฐฐ์ ์ต์ํํฉ๋๋ค.
๐งช ์์
๊ฐ๋จํ ์ ํธ๋ฆฌํฐ ํจ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค:
export function add(a: number, b: number): number {
return a + b;
}
ํด์ ๋ค์๊ณผ ๊ฐ์ Jest ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค:
test("adds two numbers", () => {
expect(add(2, 3)).toBe(5);
});
๊ฐ๋จํ๊ณ ๊ฐ๋ ์ฑ์ด ์ข์ผ๋ฉฐ ์ฆ์ ์คํํ ์ ์์ต๋๋ค.
โ ๏ธ ์ ํ ์ฌํญ
- ๊ฒํ ํ์: ์์ฑ๋ ํ ์คํธ๋ ํ๋ก๋์ ์ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ฒํ ๋์ด์ผ ํฉ๋๋ค. AI ์ถ๋ ฅ์ ๊ฐ๋ฐ์๋ฅผ ๋์ง๋ง ์ธ๊ฐ ํ๋จ์ ๋์ฒดํ ์ ์์ต๋๋ค.
- ๋ณต์กํ ๋ก์ง: ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ์ง ํจ์๋ ์ ํ์ฑ๊ณผ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ํด ์๋ ์กฐ์ ์ด ํ์ํ ์ ์์ต๋๋ค.
- ๋ฒ์: ํ์ฌ๋ ๊ธฐ๋ฅ(๋จ์ ์์ค) ํ ์คํธ ์ผ์ด์ค๋ง ์ง์๋ฉ๋๋ค. REST API ํ ์คํธ, Swagger/OpenAPI ๊ธฐ๋ฐ ์์ฑ ๋ฐ ์๋โํฌโ์๋ ์๋๋ฆฌ์ค๋ ์์ง ์ ๊ณต๋์ง ์์ต๋๋ค.
์ด๋ฌํ ์ ์ฝ์ ํ์ฌ ๋ฒ์๋ฅผ ์ ์ํ๊ณ ํฅํ ๊ฐ์ ๊ธฐํ๋ฅผ ๊ฐ์กฐํฉ๋๋ค.
๐ค Open Source & Collaboration
ts-genai-test๋ ์์ ์คํ ์์ค์
๋๋ค. ๊ธฐ์ฌ, ์ด์, ๊ธฐ๋ฅ ์์ฒญ์ ํ์ํฉ๋๋ค!
ํ ์คํธ๋ฅผ ์ฆ๊ธฐ์ธ์!
Contributions Welcome
์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ๋ถ์ผ์์ ๋์์ ์ฐพ๊ณ ์์ต๋๋ค:
- ์ถ๊ฐ AI ์ ๊ณต์ ์ง์
- ํ๋กฌํํธ ํ์ง ๊ฐ์
- ๋ค๋ฅธ ํ ์คํธ ํ๋ ์์ํฌ ์ง์ ์ถ๊ฐ
- REST ๋๋ Swagger ๊ธฐ๋ฐ ํ ์คํธ ์์ฑ ํ์
- ์ง์๋์ง ์๋ ์ธ์ด ๋ฐ ์๋ชป๋ ์ฝ๋ ์ฒ๋ฆฌ
- TypeScript๊ฐ ์๋ ํ์ผ ์ง์
๋ฌธ์ ๋ฐ ์์
๐ GitHub: testcase-gen-ai-ts
๐ฆ npm: ts-genai-test
๐งฐ ๊ธฐ์ ์คํ
- TypeScript
- Node.js
- pnpm (v10.24.0)
- Jest
- Generative AI (LLMโbased test generation)
๐ฆ ์ค์น
pnpm ์ฌ์ฉ (๊ถ์ฅ):
pnpm install ts-genai-test
๋๋ npm ์ฌ์ฉ:
npm install ts-genai-test
๐ Final Thoughts
์ด ํ๋ก์ ํธ๋ ์์ฑ AI๊ฐ ๊ฐ๋ฐ์๊ฐ ๋ ์ ์ ๋ ธ๋ ฅ์ผ๋ก ๋ ๋์ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋๋ก ์ด๋ป๊ฒ ๋์ธ ์ ์๋์ง๋ฅผ ํ๊ตฌํฉ๋๋ค. ์ฌ๋ ค ๊น์ ํ ์คํธ ์ค๊ณ๋ฅผ ๋์ฒดํ์ง๋ ์์ง๋ง, ๋ณด์ผ๋ฌํ๋ ์ดํธ๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ๊ฐ๋ฐ ์๋๋ฅผ ๊ฐ์ํํฉ๋๋ค.
TypeScript ๋ฐฑ์๋์์ ์์ ํ๊ณ Jest ํ ์คํธ ์์ฑ์ ๋๋ฌด ๋ง์ ์๊ฐ์ ์๋นํ๊ณ ์๋ค๋ฉด, ์ด ๋๊ตฌ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๊ธฐ์ฌ๋ ์ธ์ ๋ ํ์ํฉ๋๋ค!