logologo
Bắt đầu
Hướng dẫn
Phát triển
Plugin
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
Bắt đầu
Hướng dẫn
Phát triển
Plugin
API
logologo

Bắt đầu nhanh

Tổng quan phát triển plugin
Viết plugin đầu tiên
Cấu trúc thư mục dự án

Phát triển phía server

Tổng quan
Plugin
Collections (Bảng dữ liệu)
Thao tác Database
Quản lý DataSourceManager
Quản lý ResourceManager
Kiểm soát quyền ACL
Middleware
Cache
Event
Ngữ cảnh yêu cầu (Context)
Script nâng cấp (Migration)
Logger (Nhật ký)
I18n (Quốc tế hóa)
Command (Dòng lệnh)
Quản lý tác vụ định kỳ (CronJobManager)
Test

Phát triển phía client

Tổng quan
Plugin
Ngữ cảnh (Context)
Router
Kiểm soát quyền ACL
Quản lý DataSourceManager
Resource
Request
Styles & Themes
Logger (Nhật ký)
I18n (Quốc tế hóa)
Test

Khác

Hướng dẫn nâng cấp plugin
Danh sách ngôn ngữ
Quản lý phụ thuộc
Build
Previous PageQuản lý tác vụ định kỳ (CronJobManager)
Next PageTổng quan
TIP

Tài liệu này được dịch bởi AI. Đối với bất kỳ thông tin không chính xác nào, vui lòng tham khảo phiên bản tiếng Anh

#Kiểm thử

NocoBase cung cấp một bộ công cụ kiểm thử toàn diện, giúp các nhà phát triển nhanh chóng xác minh tính đúng đắn của logic cơ sở dữ liệu, giao diện API và việc triển khai tính năng trong quá trình phát triển plugin. Bài viết này sẽ hướng dẫn cách viết, chạy và tổ chức các bài kiểm thử này.

#Tại sao cần viết kiểm thử?

Lợi ích của việc viết kiểm thử tự động trong quá trình phát triển plugin:

  • Nhanh chóng xác minh tính đúng đắn của các mô hình cơ sở dữ liệu, API và logic nghiệp vụ.
  • Tránh các lỗi hồi quy (tự động phát hiện khả năng tương thích của plugin sau khi nâng cấp lõi hệ thống).
  • Hỗ trợ môi trường tích hợp liên tục (CI) để tự động chạy kiểm thử.
  • Hỗ trợ kiểm thử chức năng của plugin mà không cần khởi động toàn bộ dịch vụ.

#Kiến thức cơ bản về môi trường kiểm thử

NocoBase cung cấp hai công cụ kiểm thử cốt lõi:

Công cụMô tảMục đích
createMockDatabaseTạo một phiên bản cơ sở dữ liệu trong bộ nhớKiểm thử các mô hình và logic cơ sở dữ liệu
createMockServerTạo một phiên bản ứng dụng hoàn chỉnh (bao gồm cơ sở dữ liệu, plugin, API, v.v.)Kiểm thử các quy trình nghiệp vụ và hành vi giao diện

#Sử dụng createMockDatabase để kiểm thử cơ sở dữ liệu

createMockDatabase phù hợp để kiểm thử các chức năng liên quan trực tiếp đến cơ sở dữ liệu, chẳng hạn như định nghĩa mô hình, kiểu trường, quan hệ, các thao tác CRUD, v.v.

#Ví dụ cơ bản

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);
  });
});

#Kiểm thử các thao tác 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');

#Kiểm thử các liên kết mô hình

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);

#Sử dụng createMockServer để kiểm thử API

createMockServer tự động tạo một phiên bản ứng dụng hoàn chỉnh bao gồm cơ sở dữ liệu, plugin và các tuyến API, rất lý tưởng để kiểm thử giao diện của plugin.

#Ví dụ cơ bản

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');
  });
});

#Kiểm thử truy vấn và cập nhật 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');

#Mô phỏng trạng thái đăng nhập hoặc kiểm thử quyền hạn

Bạn có thể bật plugin auth khi tạo MockServer, sau đó sử dụng giao diện đăng nhập để lấy token hoặc session:

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');

Bạn cũng có thể sử dụng phương thức login() đơn giản hơn:

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

#Tổ chức các tệp kiểm thử trong plugin

Bạn nên lưu trữ các tệp kiểm thử liên quan đến logic phía máy chủ trong thư mục ./src/server/__tests__ của plugin.

packages/plugins/@my-project/plugin-hello/
├── src/                     # Thư mục mã nguồn
│   └── server/              # Mã phía máy chủ
│       ├── __tests__/       # Thư mục tệp kiểm thử
│       │   ├── db.test.ts   # Kiểm thử liên quan đến cơ sở dữ liệu (sử dụng createMockDatabase)
│       │   └── api.test.ts  # Kiểm thử liên quan đến API

#Chạy kiểm thử

# Chỉ định thư mục
yarn test packages/plugins/@my-project/plugin-hello/src/server
# Chỉ định tệp
yarn test packages/plugins/@my-project/plugin-hello/src/server/__tests__/db.test.ts