1. 単体テストとは何ですか? ステップ
単体テストは、コードの単一単位 (関数やメソッドなど) が期待どおりに動作することを確認するために使用されるソフトウェア開発におけるテスト方法です。単体テストを作成することで、開発者はコードの各単位が独立して正しい結果を生成することを確認できます。単体テストは、コード内のエラーを特定して修正するのに役立ち、それによってソフトウェアの品質が向上します。
通常、単体テストの手順は次のとおりです。
- テスト ケースを作成する: コード単位の一連のテスト ケースを作成します。各テスト ケースには、特定の入力と予想される出力が含まれます。
- テストの実行: テスト フレームワークを使用して、作成された単体テストを実行します。通常、テスト フレームワークはすべてのテスト ケースを自動的に実行し、結果をレポートします。
- 結果の確認: テスト フレームワークは、各テスト ケースの合格または不合格のステータスを報告します。テスト ケースが失敗した場合は、デバッグと修正が必要なコード単位に問題があることを意味します。
- コードを修正する: テスト ケースが失敗した場合、開発者はエラーの原因を調査し、テストを成功させるために対応するコードを変更する必要があります。
- テストを繰り返す: コードを修正した後、すべてのテスト ケースを再度実行して、修正されたコードによって新しいエラーが発生していないことを確認します。
- 単体テストの主な目的は、コードの信頼性、安定性、保守性を確保することです。単体テストを作成して実行することで、開発者はプロジェクトの初期段階でバグを見つけて修正できるため、プロジェクト後半でのトラブルシューティングが困難な問題を回避できます。
2. 簡単なユニット操作、デモ
Spring Boot で単体テストを実装する手順は次のとおりです。
- 依存関係の追加:
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- テスト クラスを作成する: テストするクラスに対応するテスト クラスを作成します。テスト クラスは、テスト対象のクラスと同じパッケージ内に存在し、命名規則に従っている必要があります
YourClassTest
。テスト クラスでは、@RunWith(SpringRunner.class)
アノテーションを使用してテスト ランナーを指定し、@SpringBootTest
アノテーションを使用してSpring Boot
テスト機能を有効にします。
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class YourClassTest {
// 编写测试用例
}
- テスト ケースを作成する: テスト クラスで、テストするメソッドごとに 1 つ以上のテスト ケースを作成します。JUnit
@Test
アノテーションを使用してテスト メソッドをマークします。アサーション ( など) を使用して、メソッドの出力が期待どおりであることを検証できassertEquals
ますassertTrue
。
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class YourClassTest {
@Test
public void testYourMethod() {
YourClass yourClass = new YourClass();
int expectedResult = 42;
int actualResult = yourClass.yourMethod();
assertEquals(expectedResult, actualResult);
}
}
- テストを実行します。いずれかのテスト ケースが失敗した場合は、対応する実装コードを変更し、すべてのテスト ケースが成功するまでテストを再実行します。
別の例を追加します。
たとえば、HelloController、test/hello、テスト クラスを作成します。
@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ServletContext servletContext;
@Test
public void test1() throws Exception{
MvcResult end = mockMvc.perform(requestBuilder("/hello"))
.andExpect(mvcResult -> {
if (mvcResult.getResponse().getStatus() != 200) {
throw new RuntimeException("failed.");
}
})
.andExpect(result -> {
if (!result.getResponse().getContentType().contains("json")) {
throw new RuntimeException("failed");
}
}).andReturn();
System.out.println(end);
}
private RequestBuilder requestBuilder(String uri) {
return MockMvcRequestBuilders.get(URI.create(uri)).accept(MediaType.APPLICATION_JSON_UTF8)
.characterEncoding("UTF-8");
}
}
補足:実際のプロジェクトでは、結合度の高いビジネス手法に遭遇することがありますが、その際に苦労することになります。たとえば、入力パラメータが多すぎたり、パラメータの同値クラスが多すぎたりするため、設計中には避けるべきです。
解決策:
1. 出力にグローバル変数/オブジェクト プロパティを使用して、関数の相互呼び出しを最小限に抑えます。
2. モジュールの I/O 操作を分離して、関数呼び出しを減らします。
3. 関数呼び出しをカプセル化し、テスト中に呼び出すのではなく、関数 ID とパラメーターがグローバル変数を介して出力されます。
4. 入力が関数呼び出しを通じて取得される場合、入力は関数 ID およびグローバル変数としてもカプセル化されます。
3. 杭打ちとは何ですか?
単体テストにおけるスタブは、テスト中に実際のコンポーネント (メソッド、オブジェクト、サービスなど) の動作を置き換えるために使用されるテスト手法です。スタブは、テスト中に動作を制御するために、コードの特定の部分を模擬するためによく使用されます。これにより、外部の依存関係や他のコンポーネントの影響を気にせずに、ターゲットのメソッドやクラスのテストに集中できます。
杭打ちの主な利点は次のとおりです。
打桩
分離: 外部の依存関係や他のコンポーネントによって干渉されないように、テスト対象のコードのユニットを使用して分離します。これにより、単体テストでは、システム全体の動作ではなく、ターゲット コードの機能のみに焦点を当てることができます。- 制御可能: 杭打ちにより、交換コンポーネントの動作を事前定義できます。これは、テスト中にこれらのコンポーネントの出力を正確に制御できることを意味し、さまざまなシナリオや境界条件のテストが容易になります。
- 簡素化: 実際のコンポーネントは複雑であったり、セットアップが困難であったりする場合があります。スタブを使用すると、これらのコンポーネントをシンプルで管理しやすいモック オブジェクトに置き換えることができ、テスト プロセスを簡素化できます。
単体テストでスタブを実装するには、などのモック フレームワークを使用できますMockito
。
以下をMockito
使用した杭打ちの簡単な例を示します。
import org.junit.Test;
import org.mockito.Mockito;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
public class YourClassTest {
@Test
public void testYourMethodWithStub() {
// 创建一个依赖类的模拟对象
DependencyClass mockDependency = Mockito.mock(DependencyClass.class);
// 为模拟对象的某个方法设置预期行为(打桩)
when(mockDependency.someMethod()).thenReturn("stubbedValue");
// 将模拟对象传递给要测试的类
YourClass yourClass = new YourClass(mockDependency);
// 调用要测试的方法
String expectedResult = "expectedResult";
String actualResult = yourClass.yourMethod();
// 验证结果
assertEquals(expectedResult, actualResult);
}
}
この例では、を使用してモック オブジェクトを作成し、そのMockito
メソッドに予期される動作を設定します。次に、モック オブジェクトを に渡し、テストを実行します。このようにして、テストが動作のみに焦点を当て、実際の実装の影響を受けないようにすることができます。DependencyClass
someMethod
YourClass
YourClass
DependencyClass
間違いがありましたら、お知らせください。
この記事の内容を転載または引用する場合は、出典と原著者を明記してください。