mcpField
Q
qe-test-data-management

qe-test-data-management

github.com/proffesor-for-testingテスト・品質51981 回インストール今日更新
リポジトリ

qe-test-data-management について

開発者やテストエンジニア向けのテストデータ管理スキルです。合成データ、匿名化、分離に加え、テスト種別に応じたデータ量や一括生成を説明します。

主な機能

  1. 01faker による再現可能な合成データ生成
  2. 02機微データのマスキングやハッシュ化
  3. 03トランザクションによるテストデータ分離とクリーンアップ
  4. 04大規模データセットのバッチ生成
  5. 05ビルダーと参照整合性制約の例

活用シーン

  1. 01ユニットテスト用の最小限のデータ作成
  2. 02統合テスト向けの現実的なデータ準備
  3. 03パフォーマンステスト用の大量データ生成
  4. 04テスト環境での本番個人情報の直接利用回避

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill qe-test-data-management

インストール後、Claude Code で/qe-test-data-managementを入力して読み込まれたか確認します。

詳細

テストデータ管理

<default_to_action> テストデータを作成または管理する際は、次の点を守ってください。

  1. 本番環境の PII を直接使用しないでください
  2. faker ライブラリを使って合成データを生成してください
  3. 本番データを使用する場合は匿名化してください(マスキング、ハッシュ化)
  4. テストデータを分離してください(トランザクション、テストごとのクリーンアップ)
  5. バッチ生成でスケールさせてください(10k+ レコード/秒)

データ戦略のクイックガイド:

  • ユニットテスト:最小限のデータ(必要な分だけ)
  • 統合テスト:現実的なデータ(完全な複雑さを再現)
  • パフォーマンステスト:大量のデータ(10k+ レコード)

成功のための重要な要素:

  • テストの失敗の40%は、不十分なデータが原因です
  • PII 違反には最大€20Mの GDPR 制裁金が科されます
  • テスト環境に本番環境の PII を保存しないでください </default_to_action>

クイックリファレンスカード

使用する場面
  • テストデータセットを作成するとき
  • 機密データを扱うとき
  • 大量のデータを使ってパフォーマンステストを行うとき
  • GDPR/CCPA への準拠
データ戦略
種類用途規模
最小限ユニットテスト1~10件
現実的統合テスト100~1000件
大量パフォーマンステスト10k+ 件
エッジケース境界値テスト対象を絞ったデータ
プライバシー保護の手法
手法ユースケース
合成データ偽のデータを生成する(推奨)
マスキングj***@example.com
ハッシュ化元に戻せない仮名化
トークン化キーを使って元に戻せる

合成データの生成

import { faker } from '@faker-js/faker';

// Seed for reproducibility
faker.seed(123);

function generateUser() {
  return {
    id: faker.string.uuid(),
    email: faker.internet.email(),
    firstName: faker.person.firstName(),
    lastName: faker.person.lastName(),
    phone: faker.phone.number(),
    address: {
      street: faker.location.streetAddress(),
      city: faker.location.city(),
      zip: faker.location.zipCode()
    },
    createdAt: faker.date.past()
  };
}

// Generate 1000 users
const users = Array.from({ length: 1000 }, generateUser);

テストデータビルダーパターン

class UserBuilder {
  private user: Partial<User> = {};

  asAdmin() {
    this.user.role = 'admin';
    this.user.permissions = ['read', 'write', 'delete'];
    return this;
  }

  asCustomer() {
    this.user.role = 'customer';
    this.user.permissions = ['read'];
    return this;
  }

  withEmail(email: string) {
    this.user.email = email;
    return this;
  }

  build(): User {
    return {
      id: this.user.id ?? faker.string.uuid(),
      email: this.user.email ?? faker.internet.email(),
      role: this.user.role ?? 'customer',
      ...this.user
    } as User;
  }
}

// Usage
const admin = new UserBuilder().asAdmin().withEmail('[email protected]').build();
const customer = new UserBuilder().asCustomer().build();

データの匿名化

// Masking
function maskEmail(email) {
  const [user, domain] = email.split('@');
  return `${user[0]}***@${domain}`;
}
// [email protected] → j***@example.com

function maskCreditCard(cc) {
  return `****-****-****-${cc.slice(-4)}`;
}
// 4242424242424242 → ****-****-****-4242

// Anonymize production data
const anonymizedUsers = prodUsers.map(user => ({
  id: user.id, // Keep ID for relationships
  email: `user-${user.id}@example.com`, // Fake email
  firstName: faker.person.firstName(), // Generated
  phone: null, // Remove PII
  createdAt: user.createdAt // Keep non-PII
}));

データベーストランザクションの分離

// Best practice: use transactions for cleanup
beforeEach(async () => {
  await db.beginTransaction();
});

afterEach(async () => {
  await db.rollbackTransaction(); // Auto cleanup!
});

test('user registration', async () => {
  const user = await userService.register({
    email: '[email protected]'
  });
  expect(user.id).toBeDefined();
  // Automatic rollback after test - no cleanup needed
});

大量データの生成

// Generate 10,000 users efficiently
async function generateLargeDataset(count = 10000) {
  const batchSize = 1000;
  const batches = Math.ceil(count / batchSize);

  for (let i = 0; i < batches; i++) {
    const users = Array.from({ length: batchSize }, (_, index) => ({
      id: i * batchSize + index,
      email: `user${i * batchSize + index}@example.com`,
      firstName: faker.person.firstName()
    }));

    await db.users.insertMany(users); // Batch insert
    console.log(`Batch ${i + 1}/${batches}`);
  }
}

エージェント主導のデータ生成

// High-speed generation with constraints
await Task("Generate Test Data", {
  schema: 'ecommerce',
  count: { users: 10000, products: 500, orders: 5000 },
  preserveReferentialIntegrity: true,
  constraints: {
    age: { min: 18, max: 90 },
    roles: ['customer', 'admin']
  }
}, "qe-test-data-architect");

// GDPR-compliant anonymization
await Task("Anonymize Production Data", {
  source: 'production-snapshot',
  piiFields: ['email', 'phone', 'ssn'],
  method: 'pseudonymization',
  retainStructure: true
}, "qe-test-data-architect");

エージェント連携のヒント

メモリ名前空間
aqe/test-data-management/
├── schemas/*            - Data schemas
├── generators/*         - Generator configs
├── anonymization/*      - PII handling rules
└── fixtures/*           - Reusable fixtures
フリート連携
const dataFleet = await FleetManager.coordinate({
  strategy: 'test-data-generation',
  agents: [
    'qe-test-data-architect',  // Generate data
    'qe-test-executor',        // Execute with data
    'qe-security-scanner'      // Validate no PII exposure
  ],
  topology: 'sequential'
});

関連スキル


覚えておくこと

テストデータはインフラストラクチャであり、後回しにするものではありません。 テストの失敗の40%は、不十分なテストデータが原因です。データの品質が低ければ、テストの品質も低くなります。

本番環境の PII を直接使用しないでください。 GDPR により、最大€20Mまたは収益の4%の制裁金が科されます。必ず合成データ、または適切に匿名化された本番環境のスナップショットを使用してください。

エージェントの活用: qe-test-data-architect は、現実的なパターン、関係、制約を備えたレコードを10k+ 件/秒で生成します。エージェントは GDPR/CCPA への準拠を自動的に確保し、テストデータのボトルネックを解消します。

コメント