Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/isen-ng/testcontainers-dotnet
dotnet port of testcontainers-java
https://github.com/isen-ng/testcontainers-dotnet
csharp dotnet dotnet-core nunit test-containers xunit
Last synced: 13 days ago
JSON representation
dotnet port of testcontainers-java
- Host: GitHub
- URL: https://github.com/isen-ng/testcontainers-dotnet
- Owner: isen-ng
- License: mit
- Created: 2019-02-19T05:17:49.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2024-05-10T03:41:55.000Z (6 months ago)
- Last Synced: 2024-05-10T04:34:44.581Z (6 months ago)
- Topics: csharp, dotnet, dotnet-core, nunit, test-containers, xunit
- Language: C#
- Size: 774 KB
- Stars: 33
- Watchers: 6
- Forks: 6
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# This repo is no longer supported or updated!
Please use the official repo: https://github.com/testcontainers/testcontainers-dotnet
# TestContainers dotnet
[![codecov](https://codecov.io/gh/isen-ng/testcontainers-dotnet/branch/master/graph/badge.svg)](https://codecov.io/gh/isen-ng/testcontainers-dotnet)
[![Sonarcloud Status](https://sonarcloud.io/api/project_badges/measure?project=testcontainers-dotnet&metric=alert_status)](https://sonarcloud.io/dashboard?id=testcontainers-dotnet)
[![Donation](https://img.shields.io/badge/Buy-me%20a%20coffee-orange.svg)](https://paypal.me/isenng)> Testcontainers is a dotnet standard 2.0 library that supports NUnit and XUnit tests, providing lightweight, throwaway
instances of common databases or anything else that can run in a Docker container.
>
> Uses common Microsoft dependency injection patterns, app and host settings, and Microsoft Extensions Logging (MEL).
>
> This is a port of [testcontainers-java](https://github.com/testcontainers/testcontainers-java) for dotnet.### Build statuses
[![Linux build status](https://img.shields.io/travis/com/isen-ng/testcontainers-dotnet/master?label=linux)](https://travis-ci.org/isen-ng/testcontainers-dotnet)
---
## Feature parity
## Linux environment
* Container management
* Docker providers
- Unix socket
- Environment
* Image management
- Pulling from public repo
- Building from docker file
* Network management
- User defined networks
- Network aliases
* Ryuk resource reaper## Linux containers on Windows (LCOW) environment
* Container management
* Docker providers
- Npipe
- Environment
* Image management
- Pulling from public repo
- Building from docker file
* Network management
- User defined networks
- Network aliases
* Ryuk resource reaper
* [Need help] Classic LCOW CI on Win10 (GUI) environment
- Requires the GUI version of Docker Desktop for Windows## Experimental LCOW on Windows environment
* Not supported
- Primarily because this experimental feature does not allow mounting of the docker socket/npipe into a container
- [More info](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/linux-containers)## Built-in containers
| Container | Readme | Version
|----------------------|-------------------------------------------------------|--------
| Generic Container | -- | [![Generic](https://img.shields.io/nuget/v/TestContainers.Container.Abstractions.svg)](https://www.nuget.org/packages/TestContainers.Container.Abstractions/)
| MsSql Container | [README](src/Container.Database.MsSql/README.md) | [![MySql](https://img.shields.io/nuget/v/TestContainers.Container.Database.MsSql.svg)](https://www.nuget.org/packages/TestContainers.Container.Database.MsSql/)
| PostgreSql Container | [README](src/Container.Database.PostgreSql/README.md) | [![PostgreSql](https://img.shields.io/nuget/v/TestContainers.Container.Database.PostgreSql.svg)](https://www.nuget.org/packages/TestContainers.Container.Database.PostgreSql/)
| ArangoDb Container | [README](src/Container.Database.ArangoDb/README.md) | [![ArangoDb](https://img.shields.io/nuget/v/TestContainers.Container.Database.ArangoDb.svg)](https://www.nuget.org/packages/TestContainers.Container.Database.ArangoDb/)
| Mysql Container | [README](src/Container.Database.MySql/README.md) | [![MySql](https://img.shields.io/nuget/v/TestContainers.Container.Database.MySql.svg)](https://www.nuget.org/packages/TestContainers.Container.Database.MySql/)## Example code
For more examples, see [integration tests](test/Container.Abstractions.Integration.Tests/Fixtures/GenericContainerFixture.cs)
### Start a container by pulling the image from a remote repository
```csharp
var container = new ContainerBuilder()
.ConfigureHostConfiguration(builder => builder.AddInMemoryCollection()) // host settings
.ConfigureAppConfiguration((context, builder) => builder.AddInMemoryCollection()) // app settings
.ConfigureDockerImageName(PlatformSpecific.TinyDockerImage)
.ConfigureLogging(builder => builder.AddConsole()) // Microsoft extensions logging
.ConfigureContainer((context, container) =>
{
// add labels
container.Labels.Add(CustomLabel.Key, CustomLabel.Value);// add environment labels
container.Env[InjectedEnvVar.Key] = InjectedEnvVar.Value;// add exposed ports (automatically mapped to higher port
container.ExposedPorts.Add(ExposedPort);/*
to do something like `docker run -p 2345:34567 alpine:latest`,
both expose port and port binding must be set
*/
container.ExposedPorts.Add(PortBinding.Key);
container.PortBindings.Add(PortBinding.Key, PortBinding.Value);// add bind mounts
container.BindMounts.Add(new Bind
{
HostPath = HostPathBinding.Key,
ContainerPath = HostPathBinding.Value,
AccessMode = AccessMode.ReadOnly
});// set working directory
container.WorkingDirectory = WorkingDirectory;// set command to run
container.Command = PlatformSpecific.ShellCommand(
$"{PlatformSpecific.Touch} {FileTouchedByCommand}; {PlatformSpecific.Shell}")
.ToList();
})
.Build();
```### Start a container by building the image from a Dockerfile
```csharp
var image = new ImageBuilder()
.ConfigureHostConfiguration(builder => builder.AddInMemoryCollection()) // host settings
.ConfigureAppConfiguration((context, builder) => builder.AddInMemoryCollection()) // app settings
.ConfigureLogging(builder => builder.AddConsole()) // Microsoft extensions logging
.ConfigureImage((context, image) =>
{
image.DockerfilePath = "Dockerfile";
image.DeleteOnExit = false;// add the Dockerfile into the build context
image.Transferables.Add("Dockerfile", new MountableFile(PlatformSpecific.DockerfileImagePath));
// add other files required by the Dockerfile into the build context
image.Transferables.Add(".", new MountableFile(PlatformSpecific.DockerfileImageContext));
})
.Build();var container = new ContainerBuilder()
.ConfigureDockerImage(image)
.ConfigureHostConfiguration(builder => builder.AddInMemoryCollection()) // host settings
.ConfigureAppConfiguration((context, builder) => builder.AddInMemoryCollection()) // app settings
.ConfigureLogging(builder => builder.AddConsole()) // Microsoft extensions logging
.ConfigureContainer((h, c) =>
{
c.ExposedPorts.Add(80);
})
.Build();
```or
```csharp
var container = new ContainerBuilder()
.ConfigureDockerImage((hostContext, builderContext) =>
{
return new ImageBuilder()
// share the app/host config and service collection from the parent builder context
.WithContextFrom(builderContext)
.ConfigureImage((context, image) =>
{
image.DeleteOnExit = false;
image.BasePath = PlatformSpecific.DockerfileImageContext;// add the Dockerfile as like the command line `-f builder.AddInMemoryCollection()) // host settings
.ConfigureAppConfiguration((context, builder) => builder.AddInMemoryCollection()) // app settings
.ConfigureLogging(builder => builder.AddConsole()) // Microsoft extensions logging
.ConfigureContainer((h, c) =>
{
c.ExposedPorts.Add(80);
})
.Build();
```### Start a container with a new network
```csharp
var container = new ContainerBuilder()
.ConfigureNetwork((hostContext, builderContext) =>
{
return new NetworkBuilder()
// share the app/host config and service collection from the parent builder context
.WithContextFrom(builderContext)
.ConfigureNetwork((context, network) =>
{
// be careful when setting static network names
// if they already exists, the existing network will be used
// otherwise, the default NetworkName is a random string
network.NetworkName = "my_network"
})
.Build();
})
.ConfigureHostConfiguration(builder => builder.AddInMemoryCollection()) // host settings
.ConfigureAppConfiguration((context, builder) => builder.AddInMemoryCollection()) // app settings
.ConfigureLogging(builder => builder.AddConsole()) // Microsoft extensions logging
.ConfigureContainer((h, c) =>
{
c.ExposedPorts.Add(80);
})
.Build();
```## Configuring TestContainers-dotnet
There are some configurations to testcontainers-dotnet that cannot be performed in code or injected.
These configuration can be set in environment variables before the first instance of your container is built.| Variable | Default | Description
|-------------------|-------------------------------------|------------
| `REAPER_DISABLED` | (not-set) | When set to `1` or `true`, disables starting of the reaper container
| `REAPER_IMAGE` | `quay.io/testcontainers/ryuk:0.2.3` | Change which container image to use for reaper
| `REAPER_PORT` | (not-set) | Use the given port for reaper instead of a dynamic port