售前客服二维码
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!
当试图为Java Ethereum应用程序编写集成测试时,您可能遇到的第一个问题是您需要一个正在运行的节点来连接发送事务。解决这个问题的一种方法是在后台手动运行节点,但是如果您想在配置项管道中运行测试,这是很难管理的,并且强制所有代码库参与者手动运行节点也不是一个理想的选择。幸运的是,有一个更好的方法!
环境准备
正在运行的码头守护程序
对Junit的理解
要测试的代码。https://github.com/kauri-io/Java-web3j-pantheon-testing/blob/4814 ff 2c 81 D5 e 1141671 B4 D1 f 0680 e 901 BC 72051/src/test/Java/io/kauri/Java/test/testweb3Jpantheon . Java # L63
用测试容器运行节点
Testcontainers是一个有用的库,它允许您以编程方式在测试代码中启动Docker容器,并且几个以太网客户端将现成的Docker容器上传到Dockerhub,这使得这项任务更加容易。
在本指南中,我将介绍如何在集成测试期间启动和关闭泛神论节点,这样您就不必手动或在配置项管道中启动节点
添加测试容器库
我们通过maven Central获得了Testcontainers库的依赖项,因此要包含这个库,请将以下依赖项添加到pom.xml(或Gradle中的等效项)中:
属国
groupIdorg.testcontainers/groupId
artifactIdtestcontainers/artifactId
版本1 . 12 . 0/版本
scopetest/scope
/依赖性
启动万神殿
最好在执行所有测试之前启动万神殿,而不是在每次测试之前,以便获得更好的性能。为了实现这种行为,我们用注释@ClassRule JUnit实例化了一个静态泛型容器。
在项目测试文件夹中创建新类,并向其中添加以下代码:
ClassRule
@ClassRule
公共静态最终GenericContainer泛洪容器=
新的GenericContainer(‘pegasyseng/panther :1 . 1 . 3’)。带出口(8545,8546)。带Command(
-启用挖掘器',
-miner-coin base=0 xfe 3b 557 E8 FB 62 b 89 f 4916 b 721 be 55 CEB 828 DBD 73 ',
- rpc-http-enabled ',
- rpc-ws-enabled ',
-网络=开发')。等待(等待Http('/liveness ')。福斯特斯考德(200)。for port(8545));
在运行任何测试之前,GenericContainer将以docker映像名作为参数进行实例化。在这种情况下,我们使用万神殿的1.1.3版本,并通过withExposedPorts(.)方法。
我们设置了一些运行时命令参数,这些参数以适合测试以下内容的方式配置节点:
启用挖掘器:启用挖掘,以便我们在测试中发送的事务包含在块中。
Miner-coinbase:使用私钥将coinbase设置为您的帐户。启用挖掘时,这是必需的。在这里,我们将该帐户设置为众所周知的万神殿开发帐户,它将在开发模式下自动加载以太。
Rpc-http-enabled:启用HTTP RPC端点,以便Web3j可以连接。
Rpc-ws-enabled:启用websocket RPC终结点。如果您只测试超文本传输协议,您不需要这样做。
网络=dev:将网络类型设置为dev。这将启动一个具有预定义配置的私有开发节点,以简化CPU使用挖掘。
等待万神殿开始
在运行测试之前,我们必须等待万神殿启动。Pantheon有一个自动配置的活性端点,因此testcontainers将自动轮询端口8545上的/liveness端点,直到它返回200响应。然后我们可以确定万神殿正在运行。
使用Web3j连接到万神殿容器
万神殿现在应该已经在本地主机上运行了。现在,您可以连接到测试类中的泛神论节点,并执行以太网操作,例如使用Web3j发送事务:
私人网站3j;
私有凭据凭据=
credentials . create('0x8f 2a 55949038 a 9610 f 50 FB 23 b 5883 F3 B4 ecb3 C3 bb 792 bcefbd 1542 c 692 be 63 ');
@之前
public void initWeb3() {
最终整数端口=万神殿容器. GetMappedport(8545);
web3j=Web3j.build(新HttpService(
http://localhost: '端口),500,Async . DefaultExecutorService());
{}
地图端口
创建容器时,我们公开了默认的JSON RPC端口8545,但是没有将其映射到本地主机上的相同端口。相反,它会自动选择一个随机可用的端口,这很有用,因为它消除了测试计算机上端口未打开的可能性(例如,如果并行运行测试,可能会出现这种情况)。
要获取映射的端口号,请调用getMappedPort(.)方法。您可以在构建Web3j连接网址时使用这些端口。
轮询间隔
默认情况下,Web3j每10秒钟轮询一次连接的以太网客户端,以获取操作,例如获取最新挖掘的块,并检查事件是否已发出。我们的万神殿测试网络通常比每10秒快得多,所以在Web3j中缩短轮询间隔应该可以提高测试速度。我们可以将轮询间隔传递给Web3j.build静态方法,上面,我们将间隔配置为500ms。
试验证瞄
在我们的私人开发网络中发送交易仍然需要天然气,所以我们必须能够访问一个帐户与积极的平衡,在开发网络中的一些帐户预载有比你需要更多的测试以太网!这些帐户的私钥记录在这里,这使得生成用于测试的凭据对象变得容易。
万神殿/网络3j
由于我们使用了@ClassRule注释,停止Pantheon容器的操作将在测试类执行结束时自动处理。但是,最好在每次测试后关闭web3j实例:
@之后
public void shuttdowweb3j(){
web 3j . shut down();
{}
摘要
用测试容器库启动万神殿节点是确保测试可以访问以太网节点的一种方便的方法。这使得在您的连续集成通道中运行测试变得容易,这意味着其他第三方贡献者可以更容易地在本地计算机上运行您的测试。
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!