快速上手接口測試

前言

最近公司開始有后端的項(xiàng)目倒戏,必不可免的需要針對這些后端API進(jìn)行測試。隨著測試技術(shù)的突飛猛進(jìn)恐似,越來越多的人喜歡造輪子杜跷。面對如此多的框架該如何選型呢。

框架選型

在眾多的框架里面矫夷,耳熟能詳?shù)母鹈疲琾ostman,RF, JMeter双藕,rest-assured淑趾,HTTPrunner....
對于框架的選型,個人的觀點(diǎn)忧陪,怎么簡單怎么來吧扣泊。

  1. 框架是否能較好的支持
  2. 框架維護(hù)成本
  3. 團(tuán)隊(duì)成員學(xué)習(xí)成本
    我的方案 Junit + Rest-Assured, 原因如下:
    *后端項(xiàng)目采用Gradle,Rest-Assured可以快速度集成嘶摊,在后續(xù)的CI中較友好延蟹,統(tǒng)一的倉庫,編譯執(zhí)行命令叶堆。
    *團(tuán)隊(duì)采用Juint做UT/IT阱飘,學(xué)習(xí)成本較低。
    *現(xiàn)有的mock server client虱颗,可以使用Gradle集成
    *Rest-Assured對restful的支持友好沥匈,提供良好的斷言,given-when-then與現(xiàn)有的AC方式相似忘渔,可接受度高

開始框架集成

build.gradle添加依賴, 在這里需要注意的是版本間的兼容


dependencies {
    testImplementation('junit:junit:4.13')
    //rest-assured
    testCompile group: 'io.rest-assured', name: 'rest-assured', version: '4.1.2'
    testCompile group: 'io.rest-assured', name: 'rest-assured-all', version: '4.1.2'
    testCompile group: 'io.rest-assured', name: 'spring-mock-mvc', version: '4.1.2'
    testImplementation 'io.rest-assured:json-path:4.1.2'
    testImplementation 'io.rest-assured:json-schema-validator:4.1.2'
    testImplementation 'io.rest-assured:xml-path:4.1.2'
    //Log4J:
    testImplementation group: 'log4j', name: 'log4j', version: '1.2.17'
    //Gson:
    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
    //Inject
    compile group: 'com.google.inject', name: 'guice', version: '4.2.3'
    //mockingbird-client
    compile group: 'mockingbird', name: 'mockingbird-client', version: '3.1-SNAPSHOT'
    compile group: 'commons-io', name: 'commons-io', version: '2.6'
    api group: 'com.ringcentral', name: 'ringcentral', version: '0.6.4'
}

使用Guice作為依賴注入在junit中使用
GuiceJUnit4Runner.java

package com.ringcentral.ltibackend;

import com.google.inject.Guice;
import com.google.inject.Module;
import com.google.inject.internal.ProviderMethodsModule;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.InitializationError;

public class GuiceJUnit4Runner extends BlockJUnit4ClassRunner {

    public GuiceJUnit4Runner(Class<?> klass) throws InitializationError {
        super(klass);
    }

    @Override
    public Object createTest() throws Exception {
        Object object = super.createTest();
        Module module = ProviderMethodsModule.forObject(object);
        Guice.createInjector(module).injectMembers(object);
        return object;
    }

}

在測試中聲明
*Test.java


@RunWith(GuiceJUnit4Runner.class)
public class VideoConfigTest {
 //todo
}

整體的框架結(jié)果如下:


image.png

上手寫case

1.使用mock讓內(nèi)部的第三方api返回期望的結(jié)果高帖,通過before,after在測試前mock辨萍,結(jié)束后清理掉mock的api棋恼。

package com.*.*.core.api;
import com.google.inject.Inject;
import com.*.*.GuiceJUnit4Runner;
import com.*.*.util.config.ApiConfig;
import com.*.*.util.config.EnvConfig;
import com.*.*.util.mock.services.MockRCServer;
import io.restassured.RestAssured;
import org.apache.http.HttpStatus;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.lessThan;

@RunWith(GuiceJUnit4Runner.class)
public class VideoConfigTest {

    private static final Long TIME_OUT = 5000L;

    @Inject
    private MockRCServer mockRCServer;

    @Before
    public void setUp() {
        mockRCServer.mockSucessRCToken();
        mockRCServer.mockVideoConfigurationReturnRCVideo();
    }

    @After
    public void teardown() {
        mockRCServer.getMockServer().deleteMockFor();
    }

    @Test
    public void videoConfigTestShouldBeCorrect() {
        RestAssured.useRelaxedHTTPSValidation();
        RestAssured.given().header("x-api-key", ApiConfig.API_HEADER).
                when().
                get(EnvConfig.LTI_SERVER_URL + ApiConfig.API_VIDEO_CONFIG).
                then().
                assertThat().
                statusCode(HttpStatus.SC_OK).
                and().assertThat().body(containsString("RCVideo")).
                and().time(lessThan(TIME_OUT));
    }

}

2.更好的斷言jsonschema,可以通過https://extendsclass.com/json-schema-validator.html生成json文件锈玉。將json文件放置在resource文件中爪飘。更多方法查看官網(wǎng)
https://rest-assured.io/

public class UserInfoTest {
    private static final Long TIME_OUT = 5000L;


    @Test
    public void userInfoTestShouldBeCorrect() {
        RestAssured.useRelaxedHTTPSValidation();
        RestAssured.given().header("x-api-key", ApiConfig.API_HEADER).
                when().
                get(EnvConfig.LTI_SERVER_URL + ApiConfig.API_USER_INFO).
                then().
                assertThat().
                statusCode(HttpStatus.SC_OK).
                and().time(lessThan(TIME_OUT)).
                and().assertThat().body(matchesJsonSchemaInClasspath("userInfo.json")).
                and().assertThat().body(containsString("\"brand\":\"rc\",\"extensionId\":\"2172406004\",\"meetingProvider\":\"RCVideo\""));
    }

}

更多問題歡迎探討~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拉背,隨后出現(xiàn)的幾起案子师崎,更是在濱河造成了極大的恐慌,老刑警劉巖椅棺,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犁罩,死亡現(xiàn)場離奇詭異齐蔽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)床估,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門含滴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丐巫,你說我怎么就攤上這事谈况。” “怎么了递胧?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵碑韵,是天一觀的道長。 經(jīng)常有香客問我缎脾,道長祝闻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上落塑,老公的妹妹穿的比我還像新娘强挫。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般堤框。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纵柿,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天蜈抓,我揣著相機(jī)與錄音,去河邊找鬼昂儒。 笑死沟使,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渊跋。 我是一名探鬼主播腊嗡,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拾酝!你這毒婦竟也來了燕少?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤蒿囤,失蹤者是張志新(化名)和其女友劉穎客们,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡底挫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年恒傻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片建邓。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡盈厘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涝缝,到底是詐尸還是另有隱情扑庞,我是刑警寧澤譬重,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布拒逮,位于F島的核電站,受9級特大地震影響臀规,放射性物質(zhì)發(fā)生泄漏滩援。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一塔嬉、第九天 我趴在偏房一處隱蔽的房頂上張望玩徊。 院中可真熱鬧,春花似錦谨究、人聲如沸恩袱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畔塔。三九已至,卻和暖如春鸯屿,著一層夾襖步出監(jiān)牢的瞬間澈吨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工寄摆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谅辣,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓婶恼,卻偏偏與公主長得像桑阶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勾邦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容