WebRTC是Web Real-Time Communication縮寫,指網頁即時通訊,是一個支援Web瀏覽器進行實時語音或視訊對話的API,實現了基於網頁的視訊會議,比如聲網的Agora Web SDK就是基於WebRTC實現音視訊通訊的。與HTTP不同,WebRTC應用的主要壓力是碼流,JMeter沒有找到提供WebRTC Sampler的第三方jar包,只能自己嘗試寫一個。
無頭瀏覽器
正常情況是開啟瀏覽器,開啟攝像頭和麥克風輸入音視訊流進行請求傳輸,測試模擬採用無頭瀏覽器,讀取本地檔案作為音視訊輸入。
無頭瀏覽器是指沒有介面的瀏覽器,通過呼叫瀏覽器API來模擬操作,比如Chrome在啟動時新增
--headless
,就可以進入無頭模式。
WebRTC是使用JavaScript編寫的,在前端領域生態相對來說豐富一些,有現成可用的Node庫Puppeteer來支援無頭瀏覽器:
為了讓JMeter能併發呼叫,需要編寫Java程式碼呼叫Puppeteer,聽著有點想象力,實際上已經有封裝好的開源庫了:jvppeteer。
Java程式碼
在pom.xml
中新增依賴:
<dependency>
<groupId>io.github.fanyong920</groupId>
<artifactId>jvppeteer</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>5.3</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>5.3</version>
</dependency>
jvppeteer
是Java封裝Puppeteer包,ApacheJMeter_core
和ApacheJMeter_java
用來擴充套件JMeter。
新建\src\main\java\App.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<String> 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()
在執行時每個執行緒只會執行一次。
無頭瀏覽器核心引數配置如下:
Java程式碼寫好後,需要打成jar包提供給JMeter呼叫。打包過程如下:
點選右上角Project Structure:
開啟Artifacts,點選+號,填寫名字,在右邊區域雙擊編譯後輸出檔案目錄到左邊:
點選OK確認後,從選單欄找到Build Artifacts點選:
Build就可以了:
JMeter使用
首先需要把jar包複製到lib\ext
目錄下,webrtcTest.jar
位置如下:
除了webrtcTest.jar
,還依賴3個jar包,在Settings\Build\Build Tools\Maven
找到Local repository
本地倉庫目錄後開啟,jvppeteer-1.1.2.jar
存放位置如下:
commons-compress-1.20.jar
存放位置如下:
Java-WebSocket-1.5.0.jar
存放位置如下:
然後開啟JMeter,新增執行緒組,新增Java請求,選擇剛才建立的類,初始引數也載入出來了:
預設音視訊流是這樣:
本地音視訊流是這樣:
指令碼弄好了就可以開始對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/