---
title: "Introduction"
description: "What is a Provider in CAT? Why do I need to know?"
url: "https://docs.justcat.it/reference/data-sources/providers/introduction/"
---
# Introduction


## What is a Provider in CAT?

In CAT, you define [Data sources](https://docs.justcat.it/reference/data-sources/properties/ "Data Sources") - there you tell CAT where is the data you want to test and give friendly names to these sources. But CAT also needs to know about the *format* of the data - is it CSV file, is it MS Excel workbook, is it ORACLE database? CAT accesses data using *Providers*.

> Simply said, Provider is something that can return row(s) of data. CAT has comes out-of-the-box with many implemented providers, see [Overview](https://docs.justcat.it/reference/data-sources/providers/overview/ "Providers Overview") of implemented providers.

## Where Do I Use Providers?

### Data Sources Definitions

When you define [Data sources](https://docs.justcat.it/reference/data-sources/properties/ "Data Sources") you want to test, you have to specify a provider. Example:

```yaml
Data Sources:
- Name: DWH
  Provider: SqlServer@2
  Connection string: data source=localhost;integrated security=true;initial catalog=DWH;TrustServerCertificate=true
- Name: DwhModel
  Provider: PowerBI@2
  Connection string: "DwhModel"
```

See the *Provider* row in `DWH` data source? It tells CAT that it should connect to a SQL server database. In the other data source, you instruct CAT to use its skills to connect to locally open Power BI Desktop file (`DwhModel.pbix`) and gives you opportunity to test your model before you share it with the rest of your team or with users.

### List of Tests and/or Data sources

In CAT you have a freedom where you define and maintain your tests and data sources. You can manage them in a YAML file(s), in a relational database, whatever suits you.

> In fact, any *Provider* implemented in CAT can be used to provide *Data Sources* and *Tests* definitions — with two exceptions: the tabular-model providers (`Dax`, `PowerBI`), because a DAX query returns column names in square brackets (`Tests[Test name]` for a model column, `[Test name]` for one the query names itself), which CAT does not match to property names; and, for now, `Csv@2` and `Excel@2`.

So if your tests are in a relational table in a PostgreSQL database, tell it to CAT like this:

```yaml
Get list of tests from:
- Provider: Postgres@1
  Connection string: "%DWH_CONNECTION_STRING%" # environment variable is used here
  Query: select * from public.test_definitions;
```

You can use different providers for tests and data sources, more providers for each etc. See [Project files](https://docs.justcat.it/reference/project-file/introduction/ "Project files") for more details.

## Versions

OK, I get it, but what is the `@1` at the end in all the examples? Well, databases (and other software) evolve, and so do the necessary drivers. To make things even more complicated, there are usually multiple ways how to connect to the data. These facts simply cannot be hidden and a user must be aware of that.

The documentation contains details about how exactly is CAT connecting to the data, such as what driver it uses and in what versions.

There are two primary reasons why versions were introduced to providers:

* **More ways how to access data.** E.g., for `SqlServer` provider, we have a version that uses .NET `System.Data.SqlClient` namespace (@1, deprecated) and a version that uses newer .NET `Microsoft.Data.SqlClient` namespace (@2).

* **Backward compatibility.** Whenever there will be troubles with backward compatibility of a new version of a driver, we'll keep the existing one and create new one with a raised version.

This also means that more versions of a single CAT provider can be supported at the same time.

## How every provider is used

Whatever the provider, CAT drives it the same way. These rules hold on every provider page unless the page says otherwise:

* **One statement per query.** `Query` — a test's `First query`, a list's `Query` — is handed to the provider as one statement, in whatever language the provider understands: SQL in the database's dialect, DAX for tabular models, a worksheet select for workbooks, a node path for YAML.
* **The first result set only.** A statement that returns several result sets is read for the first; the rest are ignored.
* **The test's `Timeout` is the statement's timeout.** CAT passes a test's `Timeout` to the provider, which applies it as the command timeout wherever the driver has one — a `CommandTimeout` in a connection string is only the default for tests that set none. `0` means no limit.
* **Secrets come from environment variables.** `%NAME%` anywhere in a connection string is replaced with the value of the environment variable `NAME` — a password, a token, or the whole string (`Connection string: "%DWH_CONNECTION_STRING%"`). It works the same for every provider and wherever the definition is stored. The rules are in [Environment variables](https://docs.justcat.it/reference/project-file/environment-variables/ "Environment variables"); the ways of keeping secrets out of the file in [Work with passwords](https://docs.justcat.it/how-to-guides/organize-and-run-tests/work-with-secrets/ "Work with passwords").


