Android仪器测试:在主机上运行代码(而不是在设备上)

dwbf0jvd  于 2023-05-05  发布在  Android
关注(0)|答案(1)|浏览(108)

我尝试在我的Android仪器测试中使用Testcontainers,因为我想在测试我的应用程序之前启动一个Web服务器。
问题是,在instrumentation测试中执行的所有代码都在Android设备或模拟器上运行,因此它无法访问在我的主机上运行的docker守护进程,这导致了当我运行测试并尝试使用Testcontainers库启动容器时出现此异常:
java.lang.IllegalStateException:找不到有效的Docker环境。请查看日志并检查配置
那么,是否有可能在我的机器上而不是在Android设备/模拟器中执行启动Testcontainers的代码,或者是否有一个很好的解决方案?
下面是一个示例类,展示了我正在尝试实现的目标:

import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static org.junit.Assert.assertTrue;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.Network;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.utility.DockerImageName;
import android.webkit.WebView;
import androidx.test.ext.junit.runners.AndroidJUnit4;

@RunWith(AndroidJUnit4.class)
public class MyIntegrationTest
{

    private GenericContainer<?> webServer;

    @BeforeClass
    public void
    startServer() {

        Network network = Network.newNetwork();

        webServer = new GenericContainer<>(DockerImageName.parse("nginx:latest"))
        .withExposedPorts(80)
        .withNetwork(network)
        .withNetworkAliases("my-web-server")
        .withCommand("nginx", "-g", "daemon off;")
        .waitingFor(Wait.forHttp("/"));

        webServer.start();
    }


    @Test
    public void testMyWebApp() {

        // Load the web application in an Android WebView

        getInstrumentation().runOnMainSync(() -> {
            WebView webView = new WebView(getInstrumentation().getContext());
            webView.getSettings().setJavaScriptEnabled(true);
            webView.loadUrl("http://my-web-server/");
            assertTrue(webView.getTitle().contains("Welcome to nginx!"));
        });
    }


    @AfterClass
    public void stopServer() {
        webServer.stop();
    }

}
olqngx59

olqngx591#

这里的解决方案是编写一个单独的脚本(例如bash或PowerShell),启动webserver docker容器并等待它。服务器启动后,您就可以启动Android测试了。

相关问题