-
-
Notifications
You must be signed in to change notification settings - Fork 68
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: show testcontainers using oci image as fixture #222
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
load("@pip//:requirements.bzl", "requirement") | ||
|
||
py_test( | ||
name = "integration_test", | ||
srcs = [ | ||
"__test__.py", | ||
"service_test.py", | ||
], | ||
data = [ | ||
"//hello_world:tarball", | ||
], | ||
main = ":__test__.py", | ||
tags = [ | ||
"requires-docker", | ||
"requires-network", | ||
], | ||
deps = [ | ||
requirement("docker"), | ||
requirement("pytest"), | ||
requirement("testcontainers"), | ||
], | ||
) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import os | ||
import sys | ||
import pytest | ||
|
||
if __name__ == "__main__": | ||
|
||
|
||
os.environ["ENV"] = "testing" | ||
|
||
args = [ | ||
"--verbose", | ||
"--ignore=external/", | ||
# Avoid loading of the plugin "cacheprovider". | ||
"-p", | ||
"no:cacheprovider", | ||
] | ||
|
||
junit_xml_out = os.environ.get("XML_OUTPUT_FILE") | ||
if junit_xml_out is not None: | ||
args.append(f"--junitxml={junit_xml_out}") | ||
|
||
test_filter = os.environ.get("TESTBRIDGE_TEST_ONLY") | ||
if test_filter is not None: | ||
args.append(f"-k={test_filter}") | ||
|
||
user_args = [] | ||
if len(user_args) > 0: | ||
args.extend(user_args) | ||
|
||
cli_args = sys.argv[1:] | ||
if len(cli_args) > 0: | ||
args.extend(cli_args) | ||
|
||
exit_code = pytest.main(args) | ||
|
||
if exit_code != 0: | ||
print("Pytest exit code: " + str(exit_code), file=sys.stderr) | ||
print("Ran pytest.main with " + str(args), file=sys.stderr) | ||
|
||
sys.exit(exit_code) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
import os | ||
import docker | ||
from testcontainers.core.container import DockerContainer | ||
|
||
TAR_PATH = os.getenv("TEST_SRCDIR") + "/_main/hello_world/tarball/tarball.tar" | ||
IMAGE_NAME = "gcr.io/oci_python_hello_world:latest" | ||
|
||
|
||
def _load_latest_tarball(): | ||
""" | ||
testcontainers requires the image already loaded in the daemon, but rules_oci places | ||
a tar file in bazel-out. | ||
So, we load the latest tarball to Docker | ||
So that we run the test against the latest image | ||
""" | ||
client = docker.from_env() | ||
with open(TAR_PATH, "rb") as f: | ||
client.images.load(f) | ||
|
||
|
||
def test_container_runs(): | ||
_load_latest_tarball() | ||
|
||
user = os.environ["USER"] | ||
|
||
with DockerContainer( | ||
IMAGE_NAME, | ||
).with_bind_ports( | ||
host=9000, | ||
container=8080, | ||
) as container: | ||
# get_exposed_port waits for the container to be ready | ||
# https://github.com/testcontainers/testcontainers-python/blob/2bcb931063e84da1364aa26937778f0e45708000/core/testcontainers/core/container.py#L107-L108 | ||
port = container.get_exposed_port(8080) | ||
|
||
# TODO(alexeagle): have the application inside the container listen on a port so we can use it as a test fixture | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @thesayyn I'm not sure it's worth landing this until we can actually communicate with a python process running in the container. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. maybe we could make it a separate example here? and use testcontainers instead of structure_test for testing. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I could imagine a separate "integration testing" example that wants to tie together the other stuff in this repo - we'd have our first cross-workspace dependencies though. I'm getting close to writing a blog post about it, is why I'm working in here at all. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
docker | ||
pytest | ||
testcontainers |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
note, this is what the aspect_rules_py
py_pytest_main
creates. That repo isn't on registry.bazel.build yet, so I just vendored the file content here.