使用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
- 用 Mocha 和 Chai 對 JavaScript 程式碼進行單元測試AIJavaScript
- java多執行緒系列:CountDownLatchJava執行緒CountDownLatch
- java 多執行緒 CountDownLatch用法Java執行緒CountDownLatch
- 使用JUnit進行單元測試
- pytest多程式/多執行緒執行測試用例執行緒
- 三個執行緒迴圈列印123-多執行緒執行緒
- [譯]對 React 元件進行單元測試React元件
- 使用Jest進行React單元測試React
- 使用 Spring 進行單元測試Spring
- 使用 QUnit 進行 JavaScript 單元測試JavaScript
- python進階(15)多執行緒與多程式效率測試Python執行緒
- Java:多執行緒等待所有執行緒結束(CountDownLatch/CyclicBarrier) .Java執行緒CountDownLatch
- 多執行緒實現順序迴圈列印執行緒
- 多執行緒 HashMap 死迴圈 問題解析執行緒HashMap
- 如何對非同步呼叫進行單元測試非同步
- 使用 Spring Boot 進行單元測試Spring Boot
- 使用xUnit為.net core程式進行單元測試(4)
- 使用xUnit為.net core程式進行單元測試(3)
- 使用xUnit為.net core程式進行單元測試 -- Assert
- 使用xUnit為.net core程式進行單元測試(1)
- 多執行緒迴圈控制欄位失效造成死迴圈的坑執行緒
- 淺談Javascript單執行緒和事件迴圈JavaScript執行緒事件
- Java多執行緒20:多執行緒下的其他元件之CountDownLatch、Semaphore、ExchangerJava執行緒元件CountDownLatch
- HashMap多執行緒下發生死迴圈的原因HashMap執行緒
- 多執行緒下HashMap的死迴圈問題執行緒HashMap
- Java多執行緒同步工具類之CountDownLatchJava執行緒CountDownLatch
- CountDownLatch 多執行緒同步輔助類用法CountDownLatch執行緒
- Java併發和多執行緒4:使用通用同步工具CountDownLatch實現執行緒等待Java執行緒CountDownLatch
- 執行緒執行順序——CountDownLatch、CyclicBarrier 、join()、執行緒池執行緒CountDownLatch
- 多執行緒程式碼示例執行緒
- Python多執行緒併發的簡單測試Python執行緒
- unittest 單元測試框架教程 1-執行測試指令碼框架指令碼
- 程式碼重構與單元測試——對方法的引數進行重構(五)
- 如何執行指定的單元測試
- Jest & enzyme 進行react單元測試React