使用CountDownLatch或迴圈屏障對多執行緒程式碼進行單元測試 -Xebia
隨著處理器比以往包裝更多的核心,併發程式設計已成為最有效利用它們的最前沿。但是,事實是併發程式的設計,編寫,測試和維護要困難得多。因此,如果我們畢竟可以為併發程式編寫有效且自動化的測試用例,則可以解決其中的大部分問題。
CountDownLatch
@Test public void should_publish_an_article_using_count_down_latch_to_fix() throws InterruptedException { //Arrange Article article = Article.newBuilder() .withBody("learning how to test multithreaded java code") .withId(1) .withTitle("title").build(); CountDownLatch countDownLatch = new CountDownLatch(1); when(this.articleRepository.findById(1)).thenReturn(article); doAnswer(invocationOnMock -> { System.out.println("Sending mail !!!"); countDownLatch.countDown(); return null; }).when(this.emailSender).sendEmail(anyString(), anyString()); //Act boolean publish = this.articlePublisher.publish(1); //Assert assertThat(publish).isTrue(); verify(this.articleRepository).findById(1); countDownLatch.await(); verify(this.emailSender).sendEmail("Article Published With Id " + 1 , "Published an article with Article Title " + "title"); verifyNoMoreInteractions(this.articleRepository, this.emailSender); } |
我們使用CountDownLatch,以便主執行緒應等待,直到呼叫send email方法。我們呼叫countDownLatch的countDown方法進行暫停倒數計時,直至awat()方法喚醒。
使用迴圈屏障Cyclic Barrier
@Test public void should_publish_an_article_using_cyclic_barrier_to_fix() throws BrokenBarrierException, InterruptedException { //Arrange Article article = Article.newBuilder() .withBody("learning how to test multithreaded java code") .withId(1) .withTitle("title").build(); CyclicBarrier cyclicBarrier = new CyclicBarrier(2, () -> System.out.println("Barrier opening")); when(this.articleRepository.findById(1)).thenReturn(article); doAnswer(invocationOnMock -> { System.out.println("sending mail !!!"); cyclicBarrier.await(); return null; }).when(this.emailSender).sendEmail(anyString(), anyString()); //Act boolean publish = this.articlePublisher.publish(1); //Assert assertThat(publish).isTrue(); verify(this.articleRepository).findById(1); cyclicBarrier.await(); verify(this.emailSender).sendEmail("Article Published With Id " + 1 , "Published an article with Article Title " + "title"); verifyNoMoreInteractions(this.articleRepository, this.emailSender); } |
迴圈屏障使這兩個併發任務同步進行。當emailSender執行緒的sendEmail方法和主執行緒同步時,將開啟屏障。
隨著執行緒數量的增加,它們可能交錯的方式也呈指數增長。根本不可能弄清楚所有這樣的交錯並對其進行測試。我們必須依靠工具為我們進行相同或相似的工作。幸運的是,其中有一些工具可以使我們的生活更輕鬆。
相關文章
- 使用FakeAsync對Angular非同步程式碼進行單元測試Angular非同步
- java 多執行緒CountDownLatchJava執行緒CountDownLatch
- 如果利用 python 對 java 程式碼進行 單元測試?PythonJava
- 三個執行緒迴圈列印123-多執行緒執行緒
- pytest多程式/多執行緒執行測試用例執行緒
- java多執行緒系列:CountDownLatchJava執行緒CountDownLatch
- python進階(15)多執行緒與多程式效率測試Python執行緒
- 使用JUnit進行單元測試
- 使用jest進行單元測試
- 多執行緒實現順序迴圈列印執行緒
- 使用Jest進行React單元測試React
- 如何使用MOQ進行單元測試
- 使用 Spring Boot 進行單元測試Spring Boot
- [譯]對 React 元件進行單元測試React元件
- 淺談Javascript單執行緒和事件迴圈JavaScript執行緒事件
- 多執行緒迴圈控制欄位失效造成死迴圈的坑執行緒
- Java多執行緒同步工具類之CountDownLatchJava執行緒CountDownLatch
- HashMap多執行緒下發生死迴圈的原因HashMap執行緒
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- 使用springboot對各層的程式碼進行測試!Spring Boot
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 使用 PyHamcrest 執行健壯的單元測試REST
- 使用Github Copilot生成單元測試並執行Github
- 多執行緒,多程式執行緒
- 程式碼重構與單元測試——對方法的引數進行重構(五)
- 執行緒以及多執行緒,多程式的選擇執行緒
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- unittest 單元測試框架教程 1-執行測試指令碼框架指令碼
- three.js 中使用多執行緒以及效能測試JS執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 併發工具類(一)等待多執行緒的CountDownLatch執行緒CountDownLatch
- 多執行緒與併發----CycliBarrier、CountDownLatch 和 Exchanger同步執行緒CountDownLatch
- 使用python對oracle進行簡單效能測試PythonOracle
- 如何執行指定的單元測試
- Python中的單元測試框架:使用unittest進行有效測試Python框架
- 如何對Spring MVC中的Controller進行單元測試SpringMVCController
- 執行緒屏障CyclicBarrier實現原理執行緒
- python多執行緒爬蟲與單執行緒爬蟲效率效率對比Python執行緒爬蟲