網頁

2018/3/3

測試 什麼是SUT與DOC,什麼是Test Double

SUT(System Under Test) 是指測試目標,就是要被測試的對象。

DOC(Depended-on Component),指的是SUT所依賴的程式或物件。

例如要測試的類別為UserService,則UserService就是SUT;而UserService的方法中可能會用到(依賴)UserDao,則UserDao就是DOC。

在測試時,SUT會是用真物件,而DOC通常會用假物件,假物件又稱為替身物件(Test Double)。

替身物件Test Double只是假物件的一個通稱,依不同的模擬程度分為:

  • Dummy: 只用作參數傳遞,不實際使用,所以不存在任何方法。通常是用來填入方法的參數列。
  • Stub: 寫死的物件,方法的回傳值是寫死的,不會依測試時的情況做改變。
  • Spy: 會紀錄自身的狀態,例如被呼叫的資訊,像是如何被呼叫,被呼叫的次數等。
  • Fake: 真實物件的簡化版,測試時與被測試物件互動。
  • Mock: 驗證方法預期被調用的情況,如方法的調用次數及返回值。

Spy和Mock的區別是,Spy是真實物件並取代物件中的某些方法而已;而Mock是建立一個完全替代真實物件的假物件。

以JUnit + Mockito的角度來看,一支用來測試UserService的測試類別UserServiceTest可能如下:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

    @InjectMocks
    private UserService userService; // SUT

    @Mock
    private UserDao userDao; // DOC, Mock object(Test Double)

    @Test
    public testSomeMethod() {
        // ...
    }

}

菜鳥工程師-肉豬

若是Spring Boot + JUnit + Mockito的話可能是:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { MySpringBootApplication.class })
public class UserServiceTest {

    @Autowired
    private UserService userService; // SUT

    @MockBean
    private UserDao userDao; // DOC, Mock object(Test Double)

    @Test
    public testSomeMethod() {
        // ...
    }

}

如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。


參考:

沒有留言:

張貼留言