noxfile.py (195 lines of code) (raw):

# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Configuration for test sessions. This is a configuration file for use with `nox <https://nox.thea.codes/>`__. This configuration is modelled after the one for the `google-cloud-biguery <https://github.com/googleapis/python-bigquery/blob/master/noxfile.py>`__ package. """ import os import random import nox # Python version used for linting. DEFAULT_PYTHON_VERSION = "3.10" # Python versions used for testing. PYTHON_VERSIONS = ["3.8", "3.9", "3.10", "3.11"] PYTHON_VERSIONS_ORACLE = ["3.8", "3.9", "3.10"] BLACK_PATHS = ( "data_validation", "samples", "tests", "third_party", "noxfile.py", "setup.py", ) LINT_PACKAGES = ["flake8", "black==22.3.0"] UNIT_PACKAGES = ["pyfakefs", "freezegun", "teradatasql"] def _setup_session_requirements(session, extra_packages=[]): """Install requirements for nox tests.""" session.install( "--upgrade", "pip", "pytest", "pytest-cov", "pytest-timeout", "wheel" ) session.install("--no-cache-dir", "-e", ".") if extra_packages: session.install(*extra_packages) @nox.session(python=PYTHON_VERSIONS, venv_backend="venv") def unit(session): # Install all test dependencies, then install local packages in-place. _setup_session_requirements(session, extra_packages=UNIT_PACKAGES) # Run py.test against the unit tests. session.run( "py.test", "--quiet", "--cov=data_validation", "--cov=tests.unit", "--cov-append", "--cov-config=.coveragerc", "--cov-report=term", os.path.join("tests", "unit"), env={"PSO_DV_CONN_HOME": ""}, *session.posargs, ) @nox.session(venv_backend="venv") def unit_small(session): unit(session) @nox.session(python=PYTHON_VERSIONS, venv_backend="venv") def samples(session): """Run the snippets test suite.""" # Sanity check: Only run snippets tests if the environment variable is set. if not os.environ.get("GOOGLE_APPLICATION_CREDENTIALS", ""): session.skip("Credentials must be set via environment variable.") # Install all test dependencies, then install local packages in place. _setup_session_requirements(session) # Run pytest against the samples tests. session.run("pytest", "samples", *session.posargs) @nox.session(python=DEFAULT_PYTHON_VERSION, venv_backend="venv") def lint(session): """Run linters. Returns a failure if the linters find linting errors or sufficiently serious code quality issues. """ _setup_session_requirements(session, extra_packages=LINT_PACKAGES) session.install("--upgrade", "pip", "wheel") session.run("flake8", "data_validation") session.run("flake8", "tests") session.run("black", "--check", *BLACK_PATHS) session.run("python", "setup.py", "check", "--strict") @nox.session(python=DEFAULT_PYTHON_VERSION, venv_backend="venv") def blacken(session): """Run black. Format code to uniform standard. """ # Pin a specific version of black, so that the linter doesn't conflict with # contributors. _setup_session_requirements(session, extra_packages=LINT_PACKAGES) session.run("black", *BLACK_PATHS) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_mysql(session): """Run MySQL integration tests. Ensure MySQL validation is running as expected. """ # Pin a specific version of black, so that the linter doesn't conflict with # contributors. _setup_session_requirements(session, extra_packages=[]) test_path = "tests/system/data_sources/test_mysql.py" expected_env_vars = ["PROJECT_ID", "MYSQL_PASSWORD", "CLOUD_SQL_CONNECTION"] for env_var in expected_env_vars: if not os.environ.get(env_var, ""): raise Exception("Expected Env Var: %s" % env_var) session.run("pytest", test_path, *session.posargs) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_postgres(session): """Run Postgres integration tests. Ensure Postgres validation is running as expected. """ # Pin a specific version of black, so that the linter doesn't conflict with # contributors. _setup_session_requirements(session, extra_packages=[]) test_path = "tests/system/data_sources/test_postgres.py" expected_env_vars = ["PROJECT_ID", "POSTGRES_PASSWORD", "CLOUD_SQL_CONNECTION"] for env_var in expected_env_vars: if not os.environ.get(env_var, ""): raise Exception("Expected Env Var: %s" % env_var) session.run("pytest", test_path, *session.posargs) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_sql_server(session): """Run SQL Server integration tests. Ensure SQL Server validation is running as expected. """ # Pin a specific version of black, so that the linter doesn't conflict with # contributors. _setup_session_requirements(session, extra_packages=["pyodbc"]) test_path = "tests/system/data_sources/test_sql_server.py" expected_env_vars = ["PROJECT_ID", "SQL_SERVER_PASSWORD", "CLOUD_SQL_CONNECTION"] for env_var in expected_env_vars: if not os.environ.get(env_var, ""): raise Exception("Expected Env Var: %s" % env_var) session.run("pytest", test_path, *session.posargs) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_bigquery(session): """Run BigQuery integration tests. Ensure BigQuery validation is running as expected. """ _setup_session_requirements(session, extra_packages=[]) test_path = "tests/system/data_sources/test_bigquery.py" env_vars = {"PROJECT_ID": os.environ.get("PROJECT_ID", "pso-kokoro-resources")} for env_var in env_vars: if not env_vars[env_var]: raise Exception("Expected Env Var: %s" % env_var) session.run("pytest", test_path, env=env_vars, *session.posargs) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_spanner(session): """Run Spanner integration tests. Ensure Spanner validation is running as expected. """ _setup_session_requirements(session, extra_packages=[]) expected_env_vars = ["PROJECT_ID"] for env_var in expected_env_vars: if not os.environ.get(env_var, ""): raise Exception("Expected Env Var: %s" % env_var) session.run("pytest", "tests/system/data_sources/test_spanner.py", *session.posargs) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_teradata(session): """Run Teradata integration tests. Ensure Teradata validation is running as expected. """ _setup_session_requirements(session, extra_packages=["teradatasql"]) expected_env_vars = ["PROJECT_ID", "TERADATA_PASSWORD", "TERADATA_HOST"] for env_var in expected_env_vars: if not os.environ.get(env_var, ""): raise Exception("Expected Env Var: %s" % env_var) session.run( "pytest", "tests/system/data_sources/test_teradata.py", *session.posargs ) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_state(session): """Run StateManager integration tests. Ensure the StateManager is running as expected. """ _setup_session_requirements(session, extra_packages=[]) test_path = "tests/system/test_state_manager.py" session.run("pytest", test_path, *session.posargs) @nox.session(python=random.choice(PYTHON_VERSIONS_ORACLE), venv_backend="venv") def integration_oracle(session): """Run Oracle integration tests. Ensure Oracle validation is running as expected. """ _setup_session_requirements(session, extra_packages=["cx_Oracle"]) expected_env_vars = [ "PROJECT_ID", "ORACLE_PASSWORD", "ORACLE_HOST", "POSTGRES_PASSWORD", "CLOUD_SQL_CONNECTION", ] for env_var in expected_env_vars: if not os.environ.get(env_var, ""): raise Exception("Expected Env Var: %s" % env_var) session.run("pytest", "tests/system/data_sources/test_oracle.py", *session.posargs) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_hive(session): """Run Hive integration tests. Ensure Hive validation is running as expected. """ _setup_session_requirements(session, extra_packages=["PyHive", "hdfs"]) expected_env_vars = ["PROJECT_ID", "HIVE_HOST"] for env_var in expected_env_vars: if not os.environ.get(env_var, ""): raise Exception("Expected Env Var: %s" % env_var) session.run("pytest", "tests/system/data_sources/test_hive.py", *session.posargs) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_snowflake(session): """Run Snowflake integration tests. Ensure Snowflake validation is running as expected. """ _setup_session_requirements( session, extra_packages=["snowflake-sqlalchemy", "snowflake-connector-python"] ) expected_env_vars = [ "PROJECT_ID", "SNOWFLAKE_ACCOUNT", "SNOWFLAKE_USER", "SNOWFLAKE_PASSWORD", ] for env_var in expected_env_vars: if not os.environ.get(env_var, ""): raise Exception("Expected Env Var: %s" % env_var) session.run( "pytest", "tests/system/data_sources/test_snowflake.py", *session.posargs ) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_db2(session): """Run DB2 integration tests. Ensure DB2 validation is running as expected. """ _setup_session_requirements(session, extra_packages=["ibm-db-sa"]) expected_env_vars = [ "PROJECT_ID", "DB2_HOST", "DB2_PASSWORD", ] for env_var in expected_env_vars: if not os.environ.get(env_var, ""): raise Exception("Expected Env Var: %s" % env_var) session.run("pytest", "tests/system/data_sources/test_db2.py", *session.posargs) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_secrets(session): """ Run SecretManager integration tests. Ensure the SecretManager is running as expected. """ _setup_session_requirements(session, extra_packages=[]) expected_env_vars = ["PROJECT_ID"] for env_var in expected_env_vars: if not os.environ.get(env_var, ""): raise Exception("Expected Env Var: %s" % env_var) test_path = "tests/system/test_secret_manager.py" session.run("pytest", test_path, *session.posargs) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_filesystem(session): """Run Filesystem integration tests. Ensure Filesystem validation is running as expected. """ _setup_session_requirements(session, extra_packages=["gcsfs"]) test_path = "tests/system/data_sources/test_filesystem.py" env_vars = {"PROJECT_ID": os.environ.get("PROJECT_ID", "pso-kokoro-resources")} for env_var in env_vars: if not env_vars[env_var]: raise Exception("Expected Env Var: %s" % env_var) session.run("pytest", test_path, env=env_vars, *session.posargs) @nox.session(python=random.choice(PYTHON_VERSIONS), venv_backend="venv") def integration_impala(session): """Run Impala integration tests. Ensure Impala validation is running as expected. """ _setup_session_requirements(session) expected_env_vars = ["PROJECT_ID", "IMPALA_HOST"] for env_var in expected_env_vars: if not os.environ.get(env_var, ""): raise Exception("Expected Env Var: %s" % env_var) session.run("pytest", "tests/system/data_sources/test_impala.py", *session.posargs)