區塊鏈研究實驗室|使用Java整合測試Pantheon執行節點情況

買賣虛擬貨幣

嘗試為Java Ethereum應用程式編寫整合測試時,您可能遇到的第一個問題是您需要一個執行中的節點來連線以傳送事務。解決此問題的一種方法是在後臺手動執行節點,但是如果要在CI管道中執行測試,則很難管理,並且強制所有程式碼庫的參與者都手動執行節點不是理想的選擇。幸運的是,有更好的方法!

環境準備

執行中的Docker守護程式

對Junit的理解

要測試的程式碼。https://github.com/kauri-io/java-web3j-pantheon-testing/blob/4814ff2c81d5e1141671b4d1f0680e901bc72051/src/test/java/io/kauri/java/test/TestWeb3jPantheon.java#L63

使用Testcontainers執行節點

Testcontainers是一個有用的庫,可讓您以程式設計方式在測試程式碼中啟動Docker容器,並且有多個以太坊客戶端將現成的Docker容器上載到Dockerhub,這使此任務更加容易。

在本指南中,我將介紹如何在整合測試期間啟動和關閉Pantheon節點,因此您不必手動或在CI管道內啟動節點

新增Testcontainers庫

我們透過maven Central獲得Testcontainers庫的依賴關係,因此要包含該庫,請將以下依賴關係新增到pom.xml(或Gradle中的等效項)中:

<dependency><groupId>org.testcontainers</groupId><artifactId>testcontainers</artifactId><version>1.12.0</version><scope>test</scope></dependency>

啟動Pantheon

最好在執行所有測試之前而不是在每次測試之前啟動Pantheon,這樣才能更好,效能更高。為了實現此行為,我們例項化了一個帶有@ClassRule JUnit批註的靜態GenericContainer。

在專案測試資料夾中建立一個new class,並將以下程式碼新增到其中:

ClassRule

@ClassRulepublicstaticfinalGenericContainerpantheonContainer=newGenericContainer("pegasyseng/pantheon:1.1.3").withExposedPorts(8545,8546).withCommand("--miner-enabled","--miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73","--rpc-http-enabled","--rpc-ws-enabled","--network=dev").waitingFor(Wait.forHttp("/liveness").forStatusCode(200).forPort(8545));

在執行任何測試之前,將例項化GenericContainer,並以docker映像名稱作為引數。在這種情況下,我們使用的是Pantheon的1.1.3版本,並透過withExposedPorts(..)方法公開了HTTP和websocket RPC的標準預設埠。

我們設定一些運runtime令引數,這些引數以適合測試以下內容的方式配置節點:

miner-enabled:啟用挖掘,以便我們在測試中傳送的交易包含在塊中。

miner-coinbase:將coinbase設定為您具有私鑰的帳戶。啟用挖掘時,這是必需的。在這裡,我們將帳戶設定為眾所周知的Pantheon開發帳戶,在開發模式下該帳戶會自動隨Ether載入。

rpc-http-enabled:啟用HTTP RPC端點,以便Web3j可以連線。

rpc-ws-enabled:啟用websocket RPC端點。如果僅測試HTTP,則不需要這樣做。

network = dev:將網路型別設定為dev。這將啟動具有預定義配置的私有開發節點,以簡化CPU使用率的挖掘。

等待Pantheon啟動

在執行測試之前,我們必須等待Pantheon啟動。Pantheon具有自動配置的活動性端點,因此testcontainers會自動輪詢埠8545上的/liveness端點,直到它返回200響應為止。然後我們可以確信Pantheon正在執行。

使用Web3j連線到Pantheon容器

Pantheon現在應該已啟動並在localhost上執行。現在您可以連線到測試類中的Pantheon節點,並執行以太坊操作,例如使用Web3j傳送事務:

privateWeb3jweb3j;privateCredentialscredentials=Credentials.create("0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63");@BeforepublicvoidinitWeb3(){finalIntegerport=pantheonContainer.getMappedPort(8545);web3j=Web3j.build(newHttpService("http://localhost:"+port),500,Async.defaultExecutorService());}

對映埠

建立容器時,我們公開了預設的JSON RPC埠8545,但未將其對映到localhost上的同一埠。而是自動選擇一個隨機可用的埠,這很有用,因為它消除了埠在測試計算機上未開啟的可能性(例如如果您並行執行測試,則可能會發生這種情況)。

要獲取對映的埠號,請在容器上呼叫getMappedPort(..)方法。構造Web3j連線URL時,可以使用這些埠。

輪詢間隔

預設情況下,Web3j每10秒鐘對連線的以太坊客戶端進行一次輪詢,以獲取諸如獲取最新的挖出的區塊以及檢查是否已發出事件之類的操作。我們的Pantheon測試網路通常比每10秒要快得多,因此,縮短Web3j中的輪詢間隔應該可以提高測試速度。我們可以將輪詢間隔傳遞給Web3j.build靜態方法,而在上面,我們將間隔配置為500ms。

測試證書

在我們的私有dev網路中傳送事務仍然需要gas,因此我們必須能夠訪問一個餘額為正的帳戶,並且開發網路中有一些帳戶預載入了比您所需要的更多的test Ether!這裡記錄了這些帳戶的私鑰,這使得生成Credentials物件以在測試中使用變得容易。

Pantheon/Web3j

由於我們使用@ClassRule批註,因此在測試類執行結束時會自動處理停止Pantheon容器的操作。不過,在每次測試後關閉web3j例項是一個好主意:

@AfterpublicvoidshutdownWeb3j(){web3j.shutdown();}

總結

使用Testcontainers庫啟動Pantheon節點是確保測試可以訪問以太坊節點的便捷方法。這使得在您的持續整合通道中執行測試變得很輕鬆,也意味著其他第三方貢獻者可以更輕鬆地在本地計算機上執行您的測試。

--------------------------------------------

原文作者:Crai

譯者:鏈三豐

譯文出處:http://bitoken.world

---------------------------------------------

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;