Spring中測(cè)試如何寫(xiě)

最近在實(shí)踐測(cè)試闯冷,經(jīng)常遇到一個(gè)問(wèn)題砂心,就是測(cè)試怎么寫(xiě),測(cè)試粒度是怎么樣的蛇耀?所以狂補(bǔ)了一下測(cè)試相關(guān)的知識(shí)辩诞。

測(cè)試金字塔

測(cè)試金字塔將測(cè)試進(jìn)行了分層,越底層的測(cè)試纺涤,實(shí)現(xiàn)成本越低译暂,測(cè)試效率更高,可維護(hù)性越高撩炊,但是業(yè)務(wù)需求的反映越低


測(cè)試金字塔

如圖秧秉,測(cè)試被分成了三層,從下到上分成:Unit層衰抑,UI層和Service層象迎。

  • Unit層則是我們常說(shuō)的單元測(cè)試。
  • Service層又可以細(xì)分呛踊,如(集成測(cè)試砾淌,功能測(cè)試,系統(tǒng)測(cè)試谭网,契約測(cè)試汪厨,端到端測(cè)試)。
  • UI層則是用戶(hù)界面測(cè)試愉择。

單元測(cè)試

單元測(cè)試處于金字塔最底部劫乱,這類(lèi)測(cè)試的特點(diǎn)是:

  • 只測(cè)試單獨(dú)的class
  • 只需要有應(yīng)用的源碼,而不需要跑服務(wù)實(shí)例
  • 夠快
  • 不依賴(lài)于外部系統(tǒng)(web service锥涕,database)且不需要很多/基本沒(méi)有I/O操作(不用建立數(shù)據(jù)庫(kù))

在Spring boot中主要有三種測(cè)試方法

  • Controller測(cè)試 - 使用mockMvc
@RunWith(SpringRunner.class)
@WebMvcTest(TaskController.class)
public class TaskControllerTest { 
    @Autowired 
    private MockMvc mockMvc; 
    @MockBean 
    private TaskService taskService; 
    @Test 
    public void should_get_all_tasks_by_getAllTask() throws Exception { 
      given(taskService.getTasks())
        .willReturn(Lists.newArrayList(createTask("test"), createTask("aaa"))); 
       mockMvc.perform(MockMvcRequestBuilders.get("/tasks")) 
        .andExpect(status().isOk())
        .andExpect(jsonPath("$[0].name").value("test")) 
        .andExpect(jsonPath("$[1].name").value("aaa")); 
     } 
    public Task createTask(String name) { 
      Task task = new Task(); 
      task.setName(name); return task; 
    }
 }
  • Service測(cè)試 - 使用Mockito
@RunWith(MockitoJUnitRunner.class)
public class TaskServiceTest {
  @InjectMocks
  private TaskService taskService;
  @Mock
  private TaskRepository taskRepository;
  @Test
  public void should_return_all_tasks_when_getAllTasks() {
    given(taskRepository.findAll())
      .willReturn(Lists.newArrayList(createTask("test"), createTask("aaa")));
    List<Task> tasks = taskService.getTasks();

    assertThat(tasks.size(), is(2));
    assertThat(tasks.get(0).getName(), is("test"));
    assertThat(tasks.get(1).getName(), is("aaa"));
  }

  public Task createTask(String name) {
    Task task = new Task();
    task.setName(name);
    return task;
  }
}

repository 測(cè)試 - 使用DataJpaTest

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = NONE)
public class TaskRepositoryTest {
  @Autowired
    private TaskRepository taskRepository;

  @Autowired
  private TestEntityManager entityManager;

  @Test
  public void get_all_will_return_all_tasks() {
    List<Task> tasks = taskRepository.findAll();
    assertThat(tasks.size(), is(2));
    assertThat(tasks.get(0).getName(), is("test"));
    assertThat(tasks.get(1).getName(), is("aaa"));
  }
}

基于H2衷戈,flywayTest annotation測(cè)試的寫(xiě)法。
@FlywayTest可以放在3個(gè)地方

  • class上面:?jiǎn)蝹€(gè)class 會(huì)跑flywayclean 和flywaymigrate
  • setup方法上面:每個(gè)測(cè)試都會(huì)跑flywayclean 和flywaymigrate
  • 單個(gè)測(cè)試方法上面:?jiǎn)蝹€(gè)測(cè)試會(huì)跑flywayclean 和flywaymigrate
@SpringBootTest(classes = {Application.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Slf4j
@RunWith(SpringRunner.class)
@TestExecutionListeners({
        DependencyInjectionTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        FlywayTestExecutionListener.class
})
class FlywayMethodTest {

    @Autowired
    private UserRepository repository;

    @Test
    @FlywayTest
    void contextLoads() {
        assertThat(repository.findAll().size(), is(3));
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末层坠,一起剝皮案震驚了整個(gè)濱河市殖妇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌破花,老刑警劉巖谦趣,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異座每,居然都是意外死亡前鹅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)峭梳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舰绘,“玉大人,你說(shuō)我怎么就攤上這事〕担” “怎么了叉橱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)者蠕。 經(jīng)常有香客問(wèn)我窃祝,道長(zhǎng),這世上最難降的妖魔是什么踱侣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任粪小,我火速辦了婚禮,結(jié)果婚禮上抡句,老公的妹妹穿的比我還像新娘探膊。我一直安慰自己,他們只是感情好待榔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布逞壁。 她就那樣靜靜地躺著,像睡著了一般锐锣。 火紅的嫁衣襯著肌膚如雪腌闯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天雕憔,我揣著相機(jī)與錄音姿骏,去河邊找鬼。 笑死斤彼,一個(gè)胖子當(dāng)著我的面吹牛分瘦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琉苇,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嘲玫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了翁潘?” 一聲冷哼從身側(cè)響起趁冈,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤歼争,失蹤者是張志新(化名)和其女友劉穎拜马,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沐绒,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俩莽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乔遮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扮超。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出出刷,到底是詐尸還是另有隱情璧疗,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布馁龟,位于F島的核電站崩侠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坷檩。R本人自食惡果不足惜却音,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矢炼。 院中可真熱鬧系瓢,春花似錦、人聲如沸句灌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胰锌。三九已至肌稻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匕荸,已是汗流浹背爹谭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榛搔,地道東北人诺凡。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像践惑,于是被迫代替她去往敵國(guó)和親腹泌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理尔觉,服務(wù)發(fā)現(xiàn)凉袱,斷路器,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 本文部分內(nèi)容及示例來(lái)自Google Testing Blog侦铜,有興趣可以在文末點(diǎn)擊鏈接查看原文专甩。 Preface ...
    lshilll閱讀 912評(píng)論 1 8
  • 在正式講自動(dòng)化測(cè)試之前,我們不妨來(lái)先聊聊目前測(cè)試團(tuán)隊(duì)一般存在的幾種模式钉稍。 1.1 冰淇淋模式(ice cream ...
    博客已遷移I米陽(yáng)閱讀 4,555評(píng)論 13 17
  • 探索生物學(xué)是怎么理解大腦和心靈的涤躲? 1.大腦的發(fā)展 相信知識(shí)具有統(tǒng)一性,是迷宮的本體贡未。這種信仰包含這樣的假設(shè):人類(lèi)...
    蘇菲小姐的咖啡時(shí)光閱讀 85評(píng)論 0 0
  • 晚七點(diǎn)下班到家种樱,簡(jiǎn)單洗漱蒙袍,換好衣服,婆婆還在抱著孩子嫩挤,公公已經(jīng)給熱好飯菜害幅,端上了飯桌,看著這一切心里滿(mǎn)是感...
    童Vs源閱讀 187評(píng)論 0 0