簡體   English   中英

我是否需要測試接口的每個實現來測試接口?

[英]Do I need to test each implementation of an interface to test the interface?

通常,我的應用程序中只有一個接口實現,並且在為接口編寫測試時總是使用第一個實現。 假設我有一個Destroyer接口和一個DestroyerImpl實現。 然后我會在測試中使用該類:

class DestroyerTest 
{
    private Destroyer destroyer = new DestroyerImpl();

    @Test
    public void test() { ... }   
}

然后通過在接口測試中實例化來隱式測試該類。 如果我寫另一個實現類EpicDestroyer我現在覺得我必須測試它。

那么,我是否編寫了兩個測試類DestroyerImplTestEpicDestroyerTest ,它們都使用不同的實現來測試相同的Destroyer接口? 這不是多余的嗎? 我可以通過參數化來測試同一測試套件中的每個實現 這是這樣做的嗎?

我認為你對測試的想法存在誤解。

測試界面沒有任何意義,因為它只是一個規范。 只能測試實現。 所以你應該測試所有的實現。 但是,您可以從界面派生測試用例,因為所有實現都需要遵守其中的規范。 因此即使您有完全不同的實現,您也可以在這些實現之間共享測試。

在我看來應該有如下的測試類:

import java.util.List;

import org.junit.Assert;
import org.junit.Test;


public abstract class AbstractModifiableListTest
{

    protected abstract <T> List<T> createListInstanceUnderTest(T... elements);

    @Test
    public void removeDecreasesSizeByOne() {
        List<String> list = this.<String>createListInstanceUnderTest("a","b","c");
        int originalSize = list.size();

        list.remove( 0 );
        int newSize = list.size();

        Assert.assertEquals( originalSize - 1, newSize );
    }
}

包含測試接口規范的測試用例 - 在本例java.util.List 然后,通過實現抽象方法並可能添加依賴於實現的測試用例,測試實現然后參數化測試用例。

我從不“測試”一個界面,因為沒有什么可以測試的。 界面描述了每個實現交付的服務,它的合同。

因此,您必須測試此服務的每個實現,以確保每個人都能正確完成工作。

我不會說接口可以測試 ,因為它們提供抽象而不是實現 另一方面,測試需要確保是否實現了特定行為(並且行為在類中)。

那么,我是否編寫了兩個測試類DestroyerImplTest和EpicDestroyerTest,它們都使用不同的實現來測試相同的Destroyer接口?

我會說, 是的

如果您正在測試接口,那么使用單個實現測試它應該足夠了,因為接口不依賴於特定的實現。

當然,您可能希望測試每個實現,但是為了測試實現類,而不是接口本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM