TDDにおけるフィクスチャーとファクトリの理解-デザインパターンとテスト駆動開発-
スマートコントラクトの開発を行う中で、テストコードの書き方を学んでいるときに疑問があったので調べてみた。
ブロックチェーン開発の基本として、テスト駆動開発(TDD)を採用している。
フィクスチャーとファクトリは、どちらもテストや開発において重要な役割を果たしますが、それぞれ異なる目的と使用方法があります。
ファクトリ(Factory)
ファクトリは、オブジェクトのインスタンスを生成するためのデザインパターンです。スマートコントラクトの開発においては、特定のコントラクトのインスタンスを生成するために使用されます。ファクトリは、コントラクトのデプロイやインスタンス化を簡素化するために使用されます。
主な特徴
- インスタンス生成: 特定のコントラクトのインスタンスを生成します。
- デプロイ: コントラクトをデプロイするためのメソッドを提供します。
- 再利用性: 複数のインスタンスを生成するために再利用できます。
例
以下のコードは、Hardhatを使用してコントラクトのファクトリを取得し、コントラクトをデプロイする例です。
describe('Tokenコントラクト', () => {
let Token;
let hardhatToken;
let owner;
let addr1;
let addr2;
let addrs;
beforeEach(async () => {
// Tokenコントラクトのファクトリを取得
Token = await ethers.getContractFactory('Token');
// テスト用のアカウントを取得
[owner, addr1, addr2, ...addrs] = await ethers.getSigners();
// Tokenコントラクトをデプロイ
hardhatToken = await Token.deploy();
});
it('正しいオーナーが設定されているべき', async () => {
expect(await hardhatToken.owner()).to.equal(owner.address);
});
});
フィクスチャー(Fixture)
フィクスチャーは、テストを実行するために必要な初期設定や環境を準備するためのコードやデータのことを指します。フィクスチャーは、テストの一貫性を保ち、再現性のあるテスト環境を提供するために使用されます。
主な特徴
- 初期設定: テストを実行する前に必要な初期設定を行います。
- 一貫性: 各テストケースが一貫した初期状態から開始されることを保証します。
- 再利用性: 複数のテストケースで同じフィクスチャーを再利用できます。
例
以下のコードは、Hardhat Toolboxを使用してフィクスチャーを定義し、テストで使用する例です。
// Hardhat Toolboxを使用したテスト
describe('Hardhat Toolboxを使用したテスト', () => {
// テスト用のフィクスチャーを定義
async function deployTokenFixture() {
// 複数のテスト用アカウントを取得
const [owner, addr1, addr2] = await ethers.getSigners();
// Tokenコントラクトをデプロイ
const hardhatToken = await ethers.deployContract("Token");
// テストに有用なフィクスチャーを返す
return { hardhatToken, owner, addr1, addr2 };
}
it('トークンの総供給量が所有者に割り当てられていること', async function () {
// フィクスチャーをデプロイ
const { hardhatToken, owner } = await loadFixture(deployTokenFixture);
// オーナーのトークン残高を取得
const ownerBalance = await hardhatToken.balanceOf(owner.address);
// トークンの総供給量がオーナーの残高と等しいことを確認
expect(await hardhatToken.totalSupply()).to.equal(ownerBalance);
});
});
まとめ
-
ファクトリ:
- オブジェクトのインスタンスを生成するためのデザインパターン。
- コントラクトのデプロイやインスタンス化を簡素化するために使用される。
- 例:
ethers.getContractFactory
メソッドを使用してコントラクトのファクトリを取得。
-
フィクスチャー:
- テストの初期設定や環境を準備するためのコードやデータ。
- テストの一貫性と再現性を保証するために使用される。
- 例:
loadFixture
メソッドを使用してフィクスチャーをデプロイ。
これにより、フィクスチャーとファクトリの違いが明確になり、それぞれの役割と使用方法が理解できると思います。