logologo
시작
가이드
개발
플러그인
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
시작
가이드
개발
플러그인
API
logologo

빠른 시작

플러그인 개발 개요
첫 플러그인 작성
프로젝트 디렉토리 구조

서버사이드 개발

개요
Plugin 플러그인
Collections 데이터 테이블
Database 데이터베이스 작업
DataSourceManager 데이터 소스 관리
ResourceManager 리소스 관리
ACL 권한 제어
Middleware 미들웨어
Cache 캐시
Event 이벤트
Context 요청 컨텍스트
Migration 업그레이드 스크립트
Logger 로그
I18n 국제화
Command 커맨드 라인
CronJobManager 예약 작업 관리
Test 테스트

클라이언트사이드 개발

개요
Plugin 플러그인
Context 컨텍스트
Router 라우터
ACL 권한 제어
DataSourceManager 데이터 소스 관리
Resource 리소스
Request 요청
Styles & Themes 스타일 & 테마
Logger 로그
I18n 국제화
Test 테스트

기타

플러그인 업그레이드 가이드
언어 목록
의존성 관리
빌드
Previous PageCronJobManager 예약 작업 관리
Next Page개요
TIP

이 문서는 AI로 번역되었습니다. 부정확한 내용이 있을 경우 영어 버전을 참조하세요

#테스트

NocoBase는 개발자가 플러그인 개발 과정에서 데이터베이스 로직, API 인터페이스, 기능 구현의 정확성을 빠르게 검증할 수 있도록 완벽한 테스트 도구를 제공합니다. 이 문서에서는 이러한 테스트를 작성하고, 실행하며, 구성하는 방법을 소개합니다.

#테스트를 작성해야 하는 이유

플러그인 개발에서 자동화된 테스트를 작성하면 다음과 같은 이점이 있습니다.

  • 데이터베이스 모델, API, 비즈니스 로직의 정확성을 빠르게 검증할 수 있습니다.
  • 회귀 오류를 방지할 수 있습니다 (코어 업그레이드 후 플러그인 호환성을 자동으로 감지합니다).
  • 지속적 통합(CI) 환경에서 테스트를 자동으로 실행할 수 있도록 지원합니다.
  • 전체 서비스를 시작하지 않고도 플러그인 기능을 테스트할 수 있도록 지원합니다.

#테스트 환경 기본 사항

NocoBase는 두 가지 핵심 테스트 도구를 제공합니다.

도구설명용도
createMockDatabase인메모리 데이터베이스 인스턴스를 생성합니다.데이터베이스 모델 및 로직 테스트
createMockServer완전한 애플리케이션 인스턴스(데이터베이스, 플러그인, API 등 포함)를 생성합니다.비즈니스 프로세스 및 인터페이스 동작 테스트

#createMockDatabase를 사용한 데이터베이스 테스트

createMockDatabase는 모델 정의, 필드 타입, 관계, CRUD 작업 등 데이터베이스와 직접 관련된 기능을 테스트하는 데 적합합니다.

#기본 예시

import { createMockDatabase, Database } from '@nocobase/database';

describe('Database test', () => {
  let db: Database;

  beforeEach(async () => {
    db = await createMockDatabase();
    await db.clean({ drop: true });
  });

  afterEach(async () => {
    await db.close();
  });

  it('should create and query data', async () => {
    const User = db.collection({
      name: 'users',
      fields: [
        { type: 'string', name: 'username' },
        { type: 'integer', name: 'age' },
      ],
    });

    await User.sync();

    const user = await db.getRepository('users').create({
      values: { username: 'testuser', age: 25 },
    });

    const found = await db.getRepository('users').findOne({
      filter: { username: 'testuser' },
    });

    expect(found.get('age')).toBe(25);
  });
});

#CRUD 작업 테스트

const Posts = db.collection({
  name: 'posts',
  fields: [{ type: 'string', name: 'title' }],
});
await db.sync();

// Create
const post = await db.getRepository('posts').create({ values: { title: 'Initial Title' } });
expect(post.get('title')).toBe('Initial Title');

// Update
await db.getRepository('posts').update({
  filterByTk: post.get('id'),
  values: { title: 'Updated Title' },
});
const updated = await db.getRepository('posts').findOne({ filterByTk: post.get('id') });
expect(updated.get('title')).toBe('Updated Title');

#모델 연관 관계 테스트

const Users = db.collection({
  name: 'users',
  fields: [
    { type: 'string', name: 'username' },
    { type: 'hasMany', name: 'posts' },
  ],
});

const Posts = db.collection({
  name: 'posts',
  fields: [
    { type: 'string', name: 'title' },
    { type: 'belongsTo', name: 'author' },
  ],
});
await db.sync();

const user = await db.getRepository('users').create({ values: { username: 'tester' } });
await db.getRepository('posts').create({
  values: { title: 'Post 1', authorId: user.get('id') },
});

const result = await db.getRepository('users').findOne({
  filterByTk: user.get('id'),
  appends: ['posts'],
});
expect(result.get('posts')).toHaveLength(1);

#createMockServer를 사용한 API 테스트

createMockServer는 데이터베이스, 플러그인, API 라우트를 포함하는 완전한 애플리케이션 인스턴스를 자동으로 생성하므로, 플러그인 인터페이스를 테스트하는 데 매우 적합합니다.

#기본 예시

import { createMockServer, MockServer } from '@nocobase/test';

describe('User API test', () => {
  let app: MockServer;

  beforeEach(async () => {
    app = await createMockServer({ plugins: ['users', 'auth'] });
  });

  afterEach(async () => {
    await app.destroy();
  });

  it('should create a user', async () => {
    const response = await app.agent()
      .post('/users:create')
      .send({ username: 'test', email: 'a@b.com', password: '123456' });

    expect(response.status).toBe(200);
    expect(response.body.username).toBe('test');
  });
});

#API 쿼리 및 업데이트 테스트

// Query user list
const list = await app.agent().get('/users:list');
expect(list.body.rows.length).toBeGreaterThan(0);

// Update user
const update = await app.agent().post(`/users:update/${id}`).send({ username: 'newname' });
expect(update.body.username).toBe('newname');

#로그인 상태 또는 권한 테스트 시뮬레이션

MockServer를 생성할 때 auth 플러그인을 활성화한 다음, 로그인 인터페이스를 사용하여 토큰 또는 세션을 얻을 수 있습니다.

const res = await app
  .agent()
  .post('/auth:signin')
  .send({ 
    username: 'admin',
    password: 'admin123',
  });

const token = res.body.data.token;

await app
  .agent()
  .set('Authorization', `Bearer ${token}`)
  .get('/protected-endpoint');

더 간단한 login() 메서드를 사용할 수도 있습니다.

await app.agent().login(userOrId);

#플러그인에서 테스트 파일 구성하기

플러그인의 ./src/server/__tests__ 폴더에 서버 측 로직과 관련된 테스트 파일을 저장하는 것을 권장합니다.

packages/plugins/@my-project/plugin-hello/
├── src/                     # 소스 코드 디렉터리
│   └── server/              # 서버 측 코드
│       ├── __tests__/       # 테스트 파일 디렉터리
│       │   ├── db.test.ts   # 데이터베이스 관련 테스트 (createMockDatabase 사용)
│       │   └── api.test.ts  # API 관련 테스트

#테스트 실행하기

# 디렉터리 지정
yarn test packages/plugins/@my-project/plugin-hello/src/server
# 파일 지정
yarn test packages/plugins/@my-project/plugin-hello/src/server/__tests__/db.test.ts