mirror of
https://github.com/jupyter/docker-stacks.git
synced 2025-10-11 12:02:56 +00:00
Switch to pytest for container testing
This commit is contained in:
@@ -1,8 +1,10 @@
|
|||||||
language: generic
|
language: python
|
||||||
|
python:
|
||||||
|
- 3.6
|
||||||
sudo: required
|
sudo: required
|
||||||
services:
|
services:
|
||||||
- docker
|
- docker
|
||||||
|
install:
|
||||||
|
- pip install pytest docker
|
||||||
script:
|
script:
|
||||||
- make build-test-all
|
- make build-test-all
|
||||||
|
15
Makefile
15
Makefile
@@ -54,15 +54,8 @@ dev/%: PORT?=8888
|
|||||||
dev/%: ## run a foreground container for a stack
|
dev/%: ## run a foreground container for a stack
|
||||||
docker run -it --rm -p $(PORT):8888 $(DARGS) $(OWNER)/$(notdir $@) $(ARGS)
|
docker run -it --rm -p $(PORT):8888 $(DARGS) $(OWNER)/$(notdir $@) $(ARGS)
|
||||||
|
|
||||||
|
test/%:
|
||||||
|
@TEST_IMAGE="$(OWNER)/$(notdir $@)" pytest test
|
||||||
|
|
||||||
|
test/base-notebook: ## test supported options in the base notebook
|
||||||
test/%: ## run a stack container, check for jupyter server liveliness
|
@TEST_IMAGE="$(OWNER)/$(notdir $@)" pytest test base-notebook/test
|
||||||
@-docker rm -f iut
|
|
||||||
@docker run -d --name iut $(OWNER)/$(notdir $@)
|
|
||||||
@for i in $$(seq 0 9); do \
|
|
||||||
sleep $$i; \
|
|
||||||
docker exec iut bash -c 'wget http://localhost:8888 -O- | grep -i jupyter'; \
|
|
||||||
if [[ $$? == 0 ]]; then exit 0; fi; \
|
|
||||||
done ; exit 1
|
|
||||||
|
|
||||||
test-all: $(ALL_IMAGES:%=test/%) ## test all stacks
|
|
52
test/test_notebook.py
Normal file
52
test/test_notebook.py
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# Copyright (c) Jupyter Development Team.
|
||||||
|
# Distributed under the terms of the Modified BSD License.
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
|
||||||
|
import docker
|
||||||
|
import pytest
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='session')
|
||||||
|
def docker_client():
|
||||||
|
"""Docker client to use"""
|
||||||
|
return docker.from_env()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='session')
|
||||||
|
def image_name():
|
||||||
|
"""Image name to test"""
|
||||||
|
return os.getenv('TEST_IMAGE', 'jupyter/base-notebook')
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='function')
|
||||||
|
def nb_container(docker_client, image_name):
|
||||||
|
"""Notebook container to test"""
|
||||||
|
container = docker_client.containers.run(
|
||||||
|
image_name,
|
||||||
|
detach=True,
|
||||||
|
auto_remove=True,
|
||||||
|
ports={
|
||||||
|
'8888/tcp': 8888
|
||||||
|
}
|
||||||
|
)
|
||||||
|
yield container
|
||||||
|
container.kill()
|
||||||
|
|
||||||
|
|
||||||
|
def test_server_liveliness(nb_container):
|
||||||
|
"""Notebook server should eventually respond with HTTP 200 OK."""
|
||||||
|
for i in range(10):
|
||||||
|
try:
|
||||||
|
resp = requests.get('http://localhost:8888')
|
||||||
|
except requests.exceptions.ConnectionError:
|
||||||
|
# Wait a bit and try again. Just because the docker container
|
||||||
|
# is running doesn't mean the notebook server is ready to accept
|
||||||
|
# connections inside it.
|
||||||
|
time.sleep(i)
|
||||||
|
else:
|
||||||
|
assert resp.status_code == 200
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
assert False, 'could not connect to server'
|
Reference in New Issue
Block a user