聊聊測試用例怎麼寫

       當你點開這個連接,說明對測試用例並不陌生,不論是業務開發、中間件開發、以及專業的測試人員,利用測試用例的高效覆蓋,來進一步保證發版前工程質量永遠都是沒法繞開的話題,昨天針對後端業務開發測試用例的整改專門開了個小會,下面將一些我的相關的想法記錄下來,若是能所以幫助到其餘人那將是一件美妙的事情。java

        先來看一張圖,瞭解下測試用例的書寫都有怎樣的痛點,或許你們都經歷過,或是正在經歷着。spring

一、測試用例是什麼?數據庫

       這個問題看上去像是傳統的提問套路,我認可的確是,不過它能來事、實用爲什麼不問?測試用例是什麼,我想測試用例就是用來針對某個子方法或邏輯的測試代碼,看上去像是廢話,但實際在編寫測試用例的時候是否想過咱們的測試用例是否是寫成了集成測試?集成測試最大的弊端是不易維護,不論是後期對原有測試方法的修改仍是對用例自身的維護代價都是至關大的,固然對於一些程序主流程而言,若是本身沒有自信或者是求安心的話是能夠針對某個父方法進行必定邏輯上的集成測試,然而大多數狀況是不須要的。後端

二、分層測試工具

       測試分層(Dao、Service、Facade、Controller),針對每一層的具體特性進行有針對性的測試,Dao層的某些方法的測試的確不可避免的須要去啓動必定的配置、鏈接數據庫等。Service層用例應主測處理邏輯,Facade數據轉換層測試的覆蓋率不須要太大,Controller測試可用能調通就行,覆蓋率也不須要太大。測試

三、加載慢?調用外部環境?依賴多?this

        去除沒有必要的容器加載(spring...)、對於外部環境的調用必定要mock掉(關於mock的三方有不少,好比mockito)、以及對於須要去鏈接數據庫的(Dao層以上)方法也進行mock。編碼

四、編碼規範要方便測試用例的書寫spa

        對於邏輯複雜、分支條件多的方法要進行拆分、拆成多個子方法,每一個子方法只處理同一緯度的邏輯,這樣測試起來清晰度高並且減小了測試用例編寫的複雜性,對於邏輯維度上的流式執行方法,能夠不用進行測試覆蓋。測試用例測的是邏輯、是分支處理。在這裏也就是父方法能夠不用測試(固然萬事不能絕對)。代理

 

At last 上一個測試用例(mock工具使用mockito)

@Test
    public void testUploadOrderDocument_xingngService() throws Exception {
        WmsOrderDocument wmsOrderDocument = Mockito.mock(WmsOrderDocument.class);
        when(bestConfig.getFacilityName(anyString())).thenReturn("TEST");
        when(bestConfig.getOrganizationCode(anyString())).thenReturn("TEST");
        when(uploadSalesOrderDocService.createOrUpdateSoDoc(any(WmsUploadSoDocVo.class))).thenReturn(new ExternalPackVo());
        when(customerService.getTplCustomerInfo(anyString())).thenReturn(Mockito.mock(TplCustomerVO.class));
        WmsResponse<String> response = bestWmsServiceImpl.uploadOrderDocumentByXingngService(wmsOrderDocument);
        Assert.assertTrue(response.isSuccess());
    }

 

補充:mockito工具使用

public class GlinkOrderServiceTest {

    @InjectMocks
    private GlinkOrderServiceImpl glinkOrderService;

    @Mock
    private BestConfig bestConfig;

    @Before
    public void setup() throws Exception {
        /* 
        *初始化測試用例類中由Mockito的註解標註的全部模擬對象
        */
        MockitoAnnotations.initMocks(this);
        /*
        *將模擬對象注入至對象中,因爲@InjectMocks拿到的是對象實例而不是代理對象因此下面這句能夠不用加,但若是
        *是經過@Resource或者@Autowired對對象進行注入則下面這句是須要的
        */
        ReflectionTestUtils.setField(AopTargetUtils.getTarget(glinkOrderService),」bestConfig",
        bestConfig);
    }

    @Test
    public void testParseFacilityName() {
        String organizationCode = "EC_CA";
        String facilityName = "USCA01";
        when(bestConfig.getWarehouseCode(anyString(), anyString())).thenReturn(facilityName);
        String warehouseCode = glinkOrderService.parseFacilityName(organizationCode,facilityName);
        Assert.assertNotNull(warehouseCode);
    }
    
}
相關文章
相關標籤/搜索