# Understanding Concordia

Imagine a solution in which you can write software requirements using an Agile-style, restricted **natural language** and it automatically generates [functional test scripts](https://en.wikipedia.org/wiki/Functional_testing) for you using effective testing techniques such as [equivalence partitioning](https://en.wikipedia.org/wiki/Equivalence_partitioning), [boundary-value analysis](https://en.wikipedia.org/wiki/Boundary-value_analysis), [random testing](https://en.wikipedia.org/wiki/Random_testing) and [combinatorial testing](https://en.wikipedia.org/wiki/All-pairs_testing) and it can also use test data from [databases and files](https://concordialang.gitbook.io/concordialang/introduction/databases). Well, that's Concordia. Its solution is composed by a **metalanguage** and a **compiler**.

{% hint style="info" %}
**Concordia** is also[ the name of a roman goddess](https://www.britannica.com/topic/Concordia-Roman-goddess) who was the personification of "concord" or "agreement"**.** The idea is that the metalanguage help users, stakeholders, and software teams to discussing and reaching an agreement about the software requirements.  A shared understanding about the requirements is essential to create the right software.
{% endhint %}

## **Concordia metalanguage**

**Concordia** [**metalanguage**](https://en.wikipedia.org/wiki/Metalanguage) allows you to focus on writing your application's business rules and defining its expected behavior for when users interact with it.  Stakeholders, business analysts, testers, and programmers can now discuss the application using a single language, a single source of truth. Business-focused and testing-focused declarations are clearly separated, so you can discuss technological details only with the interested parties.

With Concordia, you can write both [functional](https://en.wikipedia.org/wiki/Functional_requirement) and [non-functional](https://en.wikipedia.org/wiki/Non-functional_requirement) requirements, although it produces only functional test cases. Because it adopts [Agile](https://agilemanifesto.org/)-style declarations, you don't have to write it so formally (like [Use Cases](https://en.wikipedia.org/wiki/Use_case) usually do) and you can use plain text - which is easy to evolve with your codebase.

We invite you to [take a look at the language](https://concordialang.gitbook.io/concordialang/introduction/language-overview) and see how it is easy to understand. It is currently available in English (`en`) and Portuguese (`pt`).

## Concordia compiler

**Concordia compiler** mix [compiler ](https://en.wikipedia.org/wiki/Compiler)techniques with [machine learning](https://en.wikipedia.org/wiki/Machine_learning) and [natural language processing](https://en.wikipedia.org/wiki/Natural_language_processing) to understand declarations in Concordia Language - which uses restricted **natural language**. After detecting declarations, it infers test scenarios, test data, and test oracles to generate test cases in a framework-independent format (see the [produced test cases](https://concordialang.gitbook.io/concordialang/how-it-works/techniques)). Finally, it uses a plug-in created for a specific testing framework to generate test scripts (that is, source code), execute them and read their results. **You don't need to write code**. And the compiler checks your declarations for logic errors and other possible problems.

Follow the [Quick Start](https://concordialang.gitbook.io/concordialang/master) to see it in action! 😉

## Concordia plug-ins

Concordia compiler uses plug-ins to transform Abstract Test Cases (ATS) into test scripts - that is, into source code. Every plug-in can be implemented to generate source code for a specific programming language and testing framework - in Java, Python, Go, PHP or whatever the language you prefer. The *generated* source code is **not** tied to JavaScript or TypeScript.

See the [available plug-ins](https://concordialang.gitbook.io/concordialang/introduction/plugins) and [how to create a plug-in](https://concordialang.gitbook.io/concordialang/development/creating-a-plug-in) for your favorite programming language and testing framework.
