qe-test-data-management について
開発者やテストエンジニア向けのテストデータ管理スキルです。合成データ、匿名化、分離に加え、テスト種別に応じたデータ量や一括生成を説明します。
主な機能
- 01faker による再現可能な合成データ生成
- 02機微データのマスキングやハッシュ化
- 03トランザクションによるテストデータ分離とクリーンアップ
- 04大規模データセットのバッチ生成
- 05ビルダーと参照整合性制約の例
活用シーン
- 01ユニットテスト用の最小限のデータ作成
- 02統合テスト向けの現実的なデータ準備
- 03パフォーマンステスト用の大量データ生成
- 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> テストデータを作成または管理する際は、次の点を守ってください。
- 本番環境の PII を直接使用しないでください
- faker ライブラリを使って合成データを生成してください
- 本番データを使用する場合は匿名化してください(マスキング、ハッシュ化)
- テストデータを分離してください(トランザクション、テストごとのクリーンアップ)
- バッチ生成でスケールさせてください(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'
});
関連スキル
- database-testing - スキーマと整合性のテスト
- compliance-testing - GDPR/CCPA への準拠
- performance-testing - パフォーマンステスト用の大量データ
覚えておくこと
テストデータはインフラストラクチャであり、後回しにするものではありません。 テストの失敗の40%は、不十分なテストデータが原因です。データの品質が低ければ、テストの品質も低くなります。
本番環境の PII を直接使用しないでください。 GDPR により、最大€20Mまたは収益の4%の制裁金が科されます。必ず合成データ、または適切に匿名化された本番環境のスナップショットを使用してください。
エージェントの活用: qe-test-data-architect は、現実的なパターン、関係、制約を備えたレコードを10k+ 件/秒で生成します。エージェントは GDPR/CCPA への準拠を自動的に確保し、テストデータのボトルネックを解消します。
コメント
Markdown 対応