1. 程式人生 > >JMeter擴充套件Java請求實現WebRTC本地音視訊推流壓測指令碼

JMeter擴充套件Java請求實現WebRTC本地音視訊推流壓測指令碼

WebRTC是Web Real-Time Communication縮寫,指網頁即時通訊,是一個支援Web瀏覽器進行實時語音或視訊對話的API,實現了基於網頁的視訊會議,比如聲網的Agora Web SDK就是基於WebRTC實現音視訊通訊的。與HTTP不同,WebRTC應用的主要壓力是碼流,JMeter沒有找到提供WebRTC Sampler的第三方jar包,只能自己嘗試寫一個。 # 無頭瀏覽器 正常情況是開啟瀏覽器,開啟攝像頭和麥克風輸入音視訊流進行請求傳輸,測試模擬採用無頭瀏覽器,讀取本地檔案作為音視訊輸入。 > 無頭瀏覽器是指沒有介面的瀏覽器,通過呼叫瀏覽器API來模擬操作,比如Chrome在啟動時新增`--headless`,就可以進入無頭模式。 WebRTC是使用JavaScript編寫的,在前端領域生態相對來說豐富一些,有現成可用的Node庫Puppeteer來支援無頭瀏覽器: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144727103-1021162814.png) 為了讓JMeter能併發呼叫,需要編寫Java程式碼呼叫Puppeteer,聽著有點想象力,實際上已經有封裝好的開源庫了:jvppeteer。 # Java程式碼 在`pom.xml`中新增依賴: ```xml io.github.fanyong920
jvppeteer 1.1.2
org.apache.jmeter ApacheJMeter_core 5.3 org.apache.jmeter ApacheJMeter_java 5.3 ``` `jvppeteer`是Java封裝Puppeteer包,`ApacheJMeter_core`和`ApacheJMeter_java`用來擴充套件JMeter。 新建`\src\main\java\App.java`: ```java import com.ruiyun.jvppeteer.core.Puppeteer; import com.ruiyun.jvppeteer.core.browser.Browser; import com.ruiyun.jvppeteer.core.page.Page; import com.ruiyun.jvppeteer.options.LaunchOptions; import com.ruiyun.jvppeteer.options.LaunchOptionsBuilder; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; public class App implements JavaSamplerClient { Browser browser; public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("chromePath", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"); params.addArgument("fakeVideoPath", "D:\\test.y4m"); params.addArgument("fakeAudioPath", "D:\\test.wav"); params.addArgument("isHeadless", "true"); params.addArgument("isLocalMedia", "true"); params.addArgument("isDefaultMedia", "false"); params.addArgument("meetingUrl", "https://test.io"); return params; } @Override public void setupTest(JavaSamplerContext javaSamplerContext) { String chromePath = javaSamplerContext.getParameter("chromePath"); String fakeVideoPath = javaSamplerContext.getParameter("fakeVideoPath"); String fakeAudioPath = javaSamplerContext.getParameter("fakeAudioPath"); String path = new String(chromePath.getBytes(), StandardCharsets.UTF_8); ArrayList argList = new ArrayList<>(); argList.add("--no-sandbox"); argList.add("--disable-setuid-sandbox"); argList.add("--ignore-certificate-errors"); argList.add("--use-fake-ui-for-media-stream"); argList.add("--use-fake-device-for-media-stream"); if (javaSamplerContext.getParameter("isLocalMedia").equals("true")) { argList.add("--use-file-for-fake-video-capture=" + fakeVideoPath); argList.add("--use-file-for-fake-audio-capture=" + fakeAudioPath); } boolean isHeadless = javaSamplerContext.getParameter("isHeadless").equals("true"); LaunchOptions options = new LaunchOptionsBuilder().withArgs(argList).withHeadless(isHeadless).withExecutablePath(path).build(); try { browser = Puppeteer.launch(options); } catch (IOException e) { e.printStackTrace(); } } @Override public SampleResult runTest(JavaSamplerContext javaSamplerContext) { try { Page page = browser.newPage(); page.goTo(javaSamplerContext.getParameter("meetingUrl")); } catch (Exception e) { e.printStackTrace(); } return null; } @Override public void teardownTest(JavaSamplerContext javaSamplerContext) { browser.close(); } } ``` `App`類繼承了`JavaSamplerClient`類。`getDefaultParameters()`定義了JMeter介面引數。`setupTest()`是測試初始化,建立無頭瀏覽器。`runTest()`是測試執行,訪問會議URL進行推流。`teardownTest()`是測試清理,關閉無頭瀏覽器。`setupTest()`和`teardownTest()`在執行時每個執行緒只會執行一次。 無頭瀏覽器核心引數配置如下: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144727609-819272371.png) Java程式碼寫好後,需要打成jar包提供給JMeter呼叫。打包過程如下: 點選右上角Project Structure: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144728001-1150632312.png) 開啟Artifacts,點選+號,填寫名字,在右邊區域雙擊編譯後輸出檔案目錄到左邊: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144728331-1708035599.png) 點選OK確認後,從選單欄找到Build Artifacts點選: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144728547-209309353.png) Build就可以了: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144728728-513766460.png) # JMeter使用 首先需要把jar包複製到`lib\ext`目錄下,`webrtcTest.jar`位置如下: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144728905-563948517.png) 除了`webrtcTest.jar`,還依賴3個jar包,在`Settings\Build\Build Tools\Maven`找到`Local repository`本地倉庫目錄後開啟,`jvppeteer-1.1.2.jar`存放位置如下: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144729108-1861624820.png) `commons-compress-1.20.jar`存放位置如下: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144729344-2013863198.png) `Java-WebSocket-1.5.0.jar`存放位置如下: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144729547-1475153425.png) 然後開啟JMeter,新增執行緒組,新增Java請求,選擇剛才建立的類,初始引數也加載出來了: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144729784-324688592.png) 預設音視訊流是這樣: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144730036-141396708.png) 本地音視訊流是這樣: ![](https://img2020.cnblogs.com/blog/1629545/202103/1629545-20210313144730465-314309346.png) 指令碼弄好了就可以開始對WebRTC應用進行壓測了。 # 小結 本文介紹瞭如何使用Java對Puppeteer封裝的jvppeteer,實現對WebRTC進行本地音視訊流的壓測指令碼,打包成jar包後,可以在JMeter中進行擴充套件,通過Java請求Sampler來呼叫。Headless Chrome對`.y4m`格式視訊和`.wav`格式音訊支援較好,建議用這兩種格式做測試。除了這種方式外,還了解到WebRTC有個官方測試引擎Kite,可以通過Selenium Grid來做自動化測試和效能測試,等實踐後再做分享。 > 參考資料: > > https://www.cnblogs.com/chenkx6/p/13639629.html > > https://baike.baidu.com/item/WebRTC/5522744?fr=aladdin > > https://github.com/puppeteer/puppeteer > > https://github.com/fanyong920/jvppeteer > > .y4m視訊下載 https://media.xiph.org/video/derf/