# Testing
The tests in this repository are system tests and run against live services, therefore, it takes a bit of configuration to run all of the tests locally.
Before you can run tests locally you must have:
* The latest [nox](https://nox.readthedocs.org/en/latest/),
[pip](https://pypi.python.org/pypi/pip), and [gcp-python-repo-tools](https://pypi.python.org/pypi/gcp-python-repo-tools) installed.
$ sudo pip install --upgrade nox-automation
* The [Google Cloud SDK](https://cloud.google.com/sdk/) installed. You
can do so with the following command:
$ curl https://sdk.cloud.google.com | bash
## System Dependencies
Running the complete suite may require system dependencies. Most of these should be installable via typical package managers like `apt-get` and [brew](http://brew.sh/).
For example, to install portaudio:
brew install portaudio
If you have trouble installing a necessary system library, try filing an issue.
### Troubleshooting
#### PortAudio on OS X
See [speech/api/README.md](speech/api/README.md).
## Preparing a project for testing
Most tests require you to have an active, billing-enabled project on the
[Google Cloud Console](https://console.cloud.google.com).
### Creating resources
Some resources need to be created in a project ahead of time before testing. We have a script that can create everything needed:
gcloud config set project
scripts/prepare-testing-project.sh
The script will also instruct you to follow a URL to enable APIs. You will need to do that.
### Getting a service account key
From the Cloud Console, create a new Service Account and download its json key. Place this file in `testing/resources/service-account.json`.
Create a new OAuth client ID. Create a file `testing/resources/client-secrets.json` and write the `client_id` and `client_secret` to the file in the [Client Secrets JSON format](https://developers.google.com/api-client-library/python/guide/aaa_client_secrets).
## Environment variables
* Copy `testing/resources/test-env.tmpl.sh` to `testing/resources/test-env.sh`, and updated it with your configuration.
* Run `source testing/resources/test-env.sh`.
* Run `export GOOGLE_APPLICATION_CREDENTIALS=testing/resources/service-account.json`.
* Run `export GOOGLE_CLIENT_SECRETS=testing/resources/client-secrets.json`.
### Test environments
We use [nox](https://nox.readthedocs.org/en/latest/) to configure
multiple python sessions:
* ``tests`` contains tests for samples that run in a normal Python 2.7 or 3.4
environment. This is everything outside of the ``appengine`` directory. It's
parameterized to run all the tests using the 2.7 and 3.4 interpreters.
* ``gae`` contains tests for samples that run only in Google App Engine. This is
(mostly) everything in the ``appengine`` directory.
* ``lint`` just runs the linter.
To see a list of the available sessions:
nox -l
To run tests for a particular session, with a particular parameter, invoke nox
with the ``-s`` flag:
nox -s "tests(interpreter='python2.7')"
To run one particular session or provide additional parameters to ``py.test``,
invoke nox like this:
nox -s tests -- storage/api
### Adding new tests
When adding a new top-level directory, be sure to edit ``.coveragerc`` to
include it in coverage reporting.
To add new tests that require Google App Engine, you must place them in
the ``appengine`` directory so that the py.test fixtures needed for App
Engine are available.