Best Testcontainers-dotnet code snippet using DotNet.Testcontainers.Containers.TestcontainersContainer.ContainerInspectResponse
TestcontainersContainer.cs
Source:TestcontainersContainer.cs  
...21    private readonly ITestcontainersClient client;22    private readonly ITestcontainersConfiguration configuration;23    private int disposed;24    [NotNull]25    private ContainerInspectResponse container = new ContainerInspectResponse();26    /// <summary>27    /// Initializes a new instance of the <see cref="TestcontainersContainer" /> class.28    /// </summary>29    /// <param name="configuration">The Testcontainers configuration.</param>30    /// <param name="logger">The logger.</param>31    protected TestcontainersContainer(ITestcontainersConfiguration configuration, ILogger logger)32    {33      this.client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, logger);34      this.configuration = configuration;35      this.Logger = logger;36    }37    /// <inheritdoc />38    public string Id39    {40      get41      {42        this.ThrowIfContainerHasNotBeenCreated();43        return this.container.ID;44      }45    }46    /// <inheritdoc />47    public string Name48    {49      get50      {51        this.ThrowIfContainerHasNotBeenCreated();52        return this.container.Name;53      }54    }55    /// <inheritdoc />56    public string IpAddress57    {58      get59      {60        this.ThrowIfContainerHasNotBeenCreated();61        return this.container.NetworkSettings.Networks.First().Value.IPAddress;62      }63    }64    /// <inheritdoc />65    public string MacAddress66    {67      get68      {69        this.ThrowIfContainerHasNotBeenCreated();70        return this.container.NetworkSettings.Networks.First().Value.MacAddress;71      }72    }73    /// <inheritdoc />74    public string Hostname75    {76      get77      {78        var dockerHostUri = this.configuration.DockerEndpointAuthConfig.Endpoint;79        switch (dockerHostUri.Scheme)80        {81          case "http":82          case "https":83          case "tcp":84            return dockerHostUri.Host;85          case "npipe":86          case "unix":87            return this.GetContainerGateway();88          default:89            throw new InvalidOperationException($"Docker endpoint {dockerHostUri} is not supported.");90        }91      }92    }93    /// <inheritdoc />94    public IDockerImage Image95    {96      get97      {98        return this.configuration.Image;99      }100    }101    /// <inheritdoc />102    public TestcontainersStates State103    {104      get105      {106        if (this.container.State == null)107        {108          return TestcontainersStates.Undefined;109        }110        try111        {112          return (TestcontainersStates)Enum.Parse(typeof(TestcontainersStates), this.container.State.Status, true);113        }114        catch (Exception)115        {116          return TestcontainersStates.Undefined;117        }118      }119    }120    /// <summary>121    /// Gets the logger.122    /// </summary>123    [NotNull]124    internal ILogger Logger { get; }125    /// <inheritdoc />126    public ushort GetMappedPublicPort(int privatePort)127    {128      return this.GetMappedPublicPort(Convert.ToString(privatePort, CultureInfo.InvariantCulture));129    }130    /// <inheritdoc />131    public ushort GetMappedPublicPort(string privatePort)132    {133      this.ThrowIfContainerHasNotBeenCreated();134      if (this.container.NetworkSettings.Ports.TryGetValue($"{privatePort}/tcp", out var portMap) && ushort.TryParse(portMap.First().HostPort, out var publicPort))135      {136        return publicPort;137      }138      else139      {140        throw new InvalidOperationException($"Exposed port {privatePort} is not mapped.");141      }142    }143    /// <inheritdoc />144    public Task<long> GetExitCode(CancellationToken ct = default)145    {146      return this.client.GetContainerExitCode(this.Id, ct);147    }148    /// <inheritdoc />149    public Task<(string Stdout, string Stderr)> GetLogs(DateTime since = default, DateTime until = default, CancellationToken ct = default)150    {151      return this.client.GetContainerLogs(this.Id, since, until, ct);152    }153    /// <inheritdoc />154    public virtual async Task StartAsync(CancellationToken ct = default)155    {156      await this.semaphoreSlim.WaitAsync(ct)157        .ConfigureAwait(false);158      try159      {160        this.container = await this.Create(ct)161          .ConfigureAwait(false);162        this.container = await this.Start(this.Id, ct)163          .ConfigureAwait(false);164      }165      finally166      {167        this.semaphoreSlim.Release();168      }169    }170    /// <inheritdoc />171    public virtual async Task StopAsync(CancellationToken ct = default)172    {173      await this.semaphoreSlim.WaitAsync(ct)174        .ConfigureAwait(false);175      try176      {177        this.container = await this.Stop(this.Id, ct)178          .ConfigureAwait(false);179      }180      catch (DockerContainerNotFoundException)181      {182        this.container = new ContainerInspectResponse();183      }184      finally185      {186        this.semaphoreSlim.Release();187      }188    }189    /// <inheritdoc />190    public Task CopyFileAsync(string filePath, byte[] fileContent, int accessMode = 384, int userId = 0, int groupId = 0, CancellationToken ct = default)191    {192      return this.client.CopyFileAsync(this.Id, filePath, fileContent, accessMode, userId, groupId, ct);193    }194    /// <inheritdoc />195    public Task<byte[]> ReadFileAsync(string filePath, CancellationToken ct = default)196    {197      return this.client.ReadFileAsync(this.Id, filePath, ct);198    }199    /// <inheritdoc />200    public Task<ExecResult> ExecAsync(IList<string> command, CancellationToken ct = default)201    {202      return this.client.ExecAsync(this.Id, command, ct);203    }204    /// <summary>205    /// Removes the Testcontainers.206    /// </summary>207    /// <param name="ct">Cancellation token.</param>208    /// <returns>A task that represents the asynchronous clean up operation of a Testcontainers.</returns>209    public async Task CleanUpAsync(CancellationToken ct = default)210    {211      await this.semaphoreSlim.WaitAsync(ct)212        .ConfigureAwait(false);213      try214      {215        this.container = await this.CleanUp(this.Id, ct)216          .ConfigureAwait(false);217      }218      finally219      {220        this.semaphoreSlim.Release();221      }222    }223    /// <inheritdoc />224    public async ValueTask DisposeAsync()225    {226      await this.DisposeAsyncCore()227        .ConfigureAwait(false);228      GC.SuppressFinalize(this);229    }230    /// <summary>231    /// Releases any resources associated with the instance of <see cref="TestcontainersContainer" />.232    /// </summary>233    /// <returns>Value task that completes when any resources associated with the instance have been released.</returns>234    protected virtual async ValueTask DisposeAsyncCore()235    {236      if (1.Equals(Interlocked.CompareExchange(ref this.disposed, 1, 0)))237      {238        return;239      }240      if (!ContainerHasBeenCreatedStates.HasFlag(this.State))241      {242        return;243      }244      // If someone calls `DisposeAsync`, we can immediately remove the container. We do not need to wait for the Resource Reaper.245      if (Guid.Empty.Equals(this.configuration.SessionId))246      {247        await this.StopAsync()248          .ConfigureAwait(false);249      }250      else251      {252        await this.CleanUpAsync()253          .ConfigureAwait(false);254      }255      this.semaphoreSlim.Dispose();256    }257    private async Task<ContainerInspectResponse> Create(CancellationToken ct = default)258    {259      if (ContainerHasBeenCreatedStates.HasFlag(this.State))260      {261        return this.container;262      }263      var id = await this.client.RunAsync(this.configuration, ct)264        .ConfigureAwait(false);265      return await this.client.InspectContainer(id, ct)266        .ConfigureAwait(false);267    }268    private async Task<ContainerInspectResponse> Start(string id, CancellationToken ct = default)269    {270      await this.client.AttachAsync(id, this.configuration.OutputConsumer, ct)271        .ConfigureAwait(false);272      await this.client.StartAsync(id, ct)273        .ConfigureAwait(false);274      this.container = await this.client.InspectContainer(id, ct)275        .ConfigureAwait(false);276      await this.configuration.StartupCallback(this, ct)277        .ConfigureAwait(false);278      // Do not use a too small frequency. Especially with a lot of containers,279      // we send many operations to the Docker endpoint. The endpoint may cancel operations.280      var frequency = (int)TimeSpan.FromSeconds(1).TotalMilliseconds;281      const int timeout = -1;282      foreach (var waitStrategy in this.configuration.WaitStrategies)283      {284        await WaitStrategy.WaitUntil(285            async () =>286            {287              this.container = await this.client.InspectContainer(id, ct)288                .ConfigureAwait(false);289              return await waitStrategy.Until(this, this.Logger)290                .ConfigureAwait(false);291            },292            frequency,293            timeout,294            ct)295          .ConfigureAwait(false);296      }297      return this.container;298    }299    private async Task<ContainerInspectResponse> Stop(string id, CancellationToken ct = default)300    {301      await this.client.StopAsync(id, ct)302        .ConfigureAwait(false);303      return await this.client.InspectContainer(id, ct)304        .ConfigureAwait(false);305    }306    private async Task<ContainerInspectResponse> CleanUp(string id, CancellationToken ct = default)307    {308      await this.client.RemoveAsync(id, ct)309        .ConfigureAwait(false);310      return new ContainerInspectResponse();311    }312    private void ThrowIfContainerHasNotBeenCreated()313    {314      if (ContainerHasBeenCreatedStates.HasFlag(this.State))315      {316        return;317      }318      throw new InvalidOperationException("Testcontainers has not been created.");319    }320    private string GetContainerGateway()321    {322      const string localhost = "localhost";323      if (!ContainerHasBeenCreatedStates.HasFlag(this.State))324      {...ContainerInspectResponse
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using DotNet.Testcontainers.Containers;4using DotNet.Testcontainers.Containers.Builders;5using DotNet.Testcontainers.Containers.Modules.Databases;6using DotNet.Testcontainers.Containers.WaitStrategies;7using Microsoft.Extensions.Logging;8{9    {10        static async Task Main(string[] args)11        {12            var testcontainersBuilder = new TestcontainersBuilder<TestcontainersContainer>()13                .WithImage("postgres")14                .WithDatabase(new PostgreSqlTestcontainerConfiguration("postgres", "postgres"))15                .WithEnvironment("POSTGRES_PASSWORD", "postgres")16                .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(5432));17            var testcontainers = testcontainersBuilder.Build();18            await testcontainers.StartAsync();19            var result = await testcontainers.ContainerInspectResponse;20            Console.WriteLine(result.State.Status);21            await testcontainers.StopAsync();22        }23    }24}25using System;26using System.Threading.Tasks;27using DotNet.Testcontainers.Containers;28using DotNet.Testcontainers.Containers.Builders;29using DotNet.Testcontainers.Containers.Modules.Databases;30using DotNet.Testcontainers.Containers.WaitStrategies;31using Microsoft.Extensions.Logging;32{33    {34        static async Task Main(string[] args)35        {36            var testcontainersBuilder = new TestcontainersBuilder<TestcontainersContainer>()37                .WithImage("postgres")38                .WithDatabase(new PostgreSqlTestcontainerConfiguration("postgres", "postgres"))39                .WithEnvironment("POSTGRES_PASSWORD", "postgres")40                .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(5432));41            var testcontainers = testcontainersBuilder.Build();42            await testcontainers.StartAsync();43            var result = await testcontainers.ContainerInspectResponse;44            Console.WriteLine(result.State.Status);45            await testcontainers.StopAsync();46        }47    }48}49using System;50using System.Threading.Tasks;51using DotNet.Testcontainers.Containers;52using DotNet.Testcontainers.Containers.Builders;53using DotNet.Testcontainers.Containers.Modules.Databases;54using DotNet.Testcontainers.Containers.WaitStrategies;55using Microsoft.Extensions.Logging;ContainerInspectResponse
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using DotNet.Testcontainers.Containers.Builders;4using DotNet.Testcontainers.Containers.Modules;5using DotNet.Testcontainers.Containers.Modules.Databases;6using DotNet.Testcontainers.Containers.WaitStrategies;7{8    {9        static async Task Main(string[] args)10        {11            using (var postgres = new TestcontainersContainer("postgres:latest",12                {13                    WaitStrategy = Wait.ForUnixContainer().UntilPortIsAvailable(5432)14                }))15            {16                await postgres.StartAsync();17                var response = await postgres.ContainerInspectAsync();18                Console.WriteLine($"Container Id: {response.ID}");19                var config = response.Config;20                Console.WriteLine($"Container Config: {config.Image}");21                var networkSettings = response.NetworkSettings;22                Console.WriteLine($"Container Network Settings: {networkSettings.Networks.Keys}");23                var mounts = response.Mounts;24                Console.WriteLine($"Container Mounts: {mounts}");25                var state = response.State;26                Console.WriteLine($"Container State: {state.Status}");27                var hostConfig = response.HostConfig;28                Console.WriteLine($"Container Host Config: {hostConfig.NetworkMode}");29                var logPath = response.LogPath;30                Console.WriteLine($"Container Log Path: {logPath}");31                var res = response.ResolvConfPath;32                Console.WriteLine($"Container Resolv Conf Path: {res}");33                var driver = response.Driver;34                Console.WriteLine($"Container Driver: {driver}");35                var execIds = response.ExecIDs;36                Console.WriteLine($"Container Exec Ids: {execIds}");37                var graphDriver = response.GraphDriver;38                Console.WriteLine($"Container Graph Driver: {graphDriver.Name}");39                var sizeRw = response.SizeRw;40                Console.WriteLine($"Container Size Rw: {sizeRw}");41                var sizeRootFs = response.SizeRootFs;42                Console.WriteLine($"Container Size Root Fs: {sizeRootFs}");43                var mounts2 = response.Mounts;44                Console.WriteLine($"Container Mounts: {mounts2}");45                var name = response.Name;46                Console.WriteLine($"Container Name: {name}");47                var volumePath = response.VolumePath;48                Console.WriteLine($"Container Volume Path: {volumePath}");ContainerInspectResponse
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using DotNet.Testcontainers.Containers;4using DotNet.Testcontainers.Containers.Builders;5using DotNet.Testcontainers.Containers.Modules;6using DotNet.Testcontainers.Containers.WaitStrategies;7{8    {9        static async Task Main(string[] args)10        {11            var testcontainer = new TestcontainersBuilder<TestcontainersContainer>()12                .WithImage("mcr.microsoft.com/dotnet/core/sdk:3.1")13                .WithCommand("tail", "-f", "/dev/null")14                .Build();15            await testcontainer.StartAsync();16            var response = testcontainer.ContainerInspectResponse;17            Console.WriteLine(response.ID);18            Console.WriteLine(response.Name);19            Console.WriteLine(response.State.Running);20            Console.WriteLine(response.Config.Image);21            Console.WriteLine(response.Config.Cmd);22            Console.WriteLine(response.Config.Hostname);23            await testcontainer.StopAsync();24        }25    }26}27using System;28using System.Threading.Tasks;29using DotNet.Testcontainers.Containers;30using DotNet.Testcontainers.Containers.Builders;31using DotNet.Testcontainers.Containers.Modules;32using DotNet.Testcontainers.Containers.WaitStrategies;33{34    {35        static async Task Main(string[] args)36        {37            var testcontainer = new TestcontainersBuilder<TestcontainersContainer>()38                .WithImage("mcr.microsoft.com/dotnet/core/sdk:3.1")39                .WithCommand("echo", "Hello, World!")40                .Build();41            await testcontainer.StartAsync();42            var logs = testcontainer.ContainerLogs;43            Console.WriteLine(logs);44            await testcontainer.StopAsync();45        }46    }47}48using System;49using System.Threading.Tasks;50using DotNet.Testcontainers.Containers;51using DotNet.Testcontainers.Containers.Builders;52using DotNet.Testcontainers.Containers.Modules;53using DotNet.Testcontainers.Containers.WaitStrategies;54{55    {56        static async Task Main(string[] args)57        {58            var testcontainer = new TestcontainersBuilder<TestcontainersContainer>()59                .WithImage("mContainerInspectResponse
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using DotNet.Testcontainers.Containers;4using DotNet.Testcontainers.Containers.Configurations;5using DotNet.Testcontainers.Containers.Modules;6using DotNet.Testcontainers.Containers.OutputConsumers;7using DotNet.Testcontainers.Images;8{9    {10        static async Task Main(string[] args)11        {12            var image = new TestcontainersImage("alpine:3.9.4");13            {14                PortBindings = new Dictionary<int, int> { { 80, 80 } },15                Mounts = new List<VolumeMount> { new VolumeMount { Source = "/tmp", Target = "/tmp" } },16                EnvironmentVariables = new Dictionary<string, string> { { "TEST", "TEST" } },17                OutputConsumer = new OutputConsumer()18            };19            await container.StartAsync();20            var response = await container.ContainerInspectResponse();21            Console.WriteLine("response: " + response);22            await container.StopAsync();23        }24    }25}26using System;27using System.Threading.Tasks;28using DotNet.Testcontainers.Containers;29using DotNet.Testcontainers.Containers.Configurations;30using DotNet.Testcontainers.Containers.Modules;31using DotNet.Testcontainers.Images;32{33    {34        static async Task Main(string[] args)35        {36            var image = new TestcontainersImage("alpine:3.9.4");37            {38                PortBindings = new Dictionary<int, int> { { 80, 80 } },39                Mounts = new List<VolumeMount> { new VolumeMount { Source = "/tmp", Target = "/tmp" } },40                EnvironmentVariables = new Dictionary<string, string> { { "TEST", "TEST" } },41                OutputConsumer = new OutputConsumer()42            };43            await container.StartAsync();44            var response = await container.ContainerInspectResponse();45            Console.WriteLine("response: " + response);46            await container.StopAsync();47        }48    }49}ContainerInspectResponse
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using DotNet.Testcontainers.Containers.Builders;4using DotNet.Testcontainers.Containers.Modules;5using DotNet.Testcontainers.Containers.WaitStrategies;6{7    {8        public static async Task Main(string[] args)9        {10            var testcontainersBuilder = new TestcontainersBuilder<TestcontainersContainer>()11                .WithImage("mcr.microsoft.com/dotnet/core/sdk:3.1")12                .WithCommand("tail -f /dev/null")13                .WithWaitStrategy(Wait.ForUnixContainer().UntilCommandIsCompleted("echo hello world"))14                .WithWorkingDirectory("/app");15            using (var container = testcontainersBuilder.Build())16            {17                await container.StartAsync();18                var containerId = container.Id;19                Console.WriteLine($"Container ID: {containerId}");20                var containerInspectResponse = container.ContainerInspectResponse;21                Console.WriteLine($"Container Inspect Response: {containerInspectResponse}");22            }23        }24    }25}26using System;27using System.Threading.Tasks;28using DotNet.Testcontainers.Containers.Builders;29using DotNet.Testcontainers.Containers.Modules;30using DotNet.Testcontainers.Containers.WaitStrategies;31{32    {33        public static async Task Main(string[] args)34        {35            var testcontainersBuilder = new TestcontainersBuilder<TestcontainersContainer>()36                .WithImage("mcr.microsoft.com/dotnet/core/sdk:3.1")37                .WithCommand("tail -f /dev/null")38                .WithWaitStrategy(Wait.ForUnixContainer().UntilCommandIsCompleted("echo hello world"))39                .WithWorkingDirectory("/app");40            using (var container = testcontainersBuilder.Build())41            {42                await container.StartAsync();43                var containerId = container.Id;44                Console.WriteLine($"Container ID: {containerId}");45                var containerInspectResponse = container.ContainerInspectResponse;46                Console.WriteLine($"Container Inspect Response: {containerInspectResponse}");47                var containerInspectResponseState = containerInspectResponse.State;48                Console.WriteLine($"Container Inspect Response State: {containerInspectResponseState}");49            }50        }51    }52}ContainerInspectResponse
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using DotNet.Testcontainers.Containers.Builders;4using DotNet.Testcontainers.Containers.Modules;5using DotNet.Testcontainers.Containers.WaitStrategies;6using DotNet.Testcontainers.Images;7using DotNet.Testcontainers.Images.Builders;8using DotNet.Testcontainers.Images.Configurations;9{10    {11        static async Task Main(string[] args)12        {13            var image = new TestcontainersImage("alpine", "3.10.2");14            var container = new TestcontainersContainerBuilder<TestcontainersContainer>()15                .WithImage(image)16                .WithWaitStrategy(Wait.ForUnixContainer().UntilCommandIsCompleted("echo hello world"))17                .WithExposedPort(80)18                .Build();19            await container.StartAsync();20            var response = container.ContainerInspectResponse;21            Console.WriteLine(response.ID);22            Console.WriteLine(response.State.Status);23            Console.WriteLine(response.NetworkSettings.Networks["bridge"].IPAddress);24            await container.StopAsync();25        }26    }27}28using System;29using System.Threading.Tasks;30using DotNet.Testcontainers.Containers.Builders;31using DotNet.Testcontainers.Containers.Modules;32using DotNet.Testcontainers.Containers.WaitStrategies;33using DotNet.Testcontainers.Images;34using DotNet.Testcontainers.Images.Builders;35using DotNet.Testcontainers.Images.Configurations;36{37    {38        static async Task Main(string[] args)39        {40            var image = new TestcontainersImage("alpine", "3.10.2");41            var container = new TestcontainersContainerBuilder<TestcontainersContainer>()42                .WithImage(image)43                .WithWaitStrategy(Wait.ForUnixContainer().UntilCommandIsCompleted("echo hello world"))44                .WithExposedPort(80)45                .Build();46            await container.StartAsync();47            Console.WriteLine(container.ContainerInspectResponse.ID);48            Console.WriteLine(container.ContainerInspectResponse.State.Status);49            Console.WriteLine(container.ContainerInspectResponse.NetworkSettings.Networks["bridge"].IPAddress);50            await container.StopAsync();51        }52    }53}54using System;55using System.Threading.Tasks;ContainerInspectResponse
Using AI Code Generation
1using DotNet.Testcontainers.Containers.Builders;2using DotNet.Testcontainers.Containers.Modules;3using DotNet.Testcontainers.Containers.WaitStrategies;4{5    public static void Main()6    {7        var testcontainersBuilder = new TestcontainersBuilder<TestcontainersContainer>()8            .WithImage("mcr.microsoft.com/dotnet/core/sdk:3.1")9            .WithWaitStrategy(Wait.ForUnixContainer().UntilCommandIsCompleted("dotnet --version"));10        using (var testcontainers = testcontainersBuilder.Build())11        {12            testcontainers.Start();13            var response = testcontainers.ContainerInspectResponse;14            System.Console.WriteLine(response.Config.Image);15        }16    }17}18using DotNet.Testcontainers.Containers.Builders;19using DotNet.Testcontainers.Containers.Modules;20using DotNet.Testcontainers.Containers.WaitStrategies;21{22    public static void Main()23    {24        var testcontainersBuilder = new TestcontainersBuilder<TestcontainersContainer>()25            .WithImage("mcr.microsoft.com/dotnet/core/sdk:3.1")26            .WithWaitStrategy(Wait.ForUnixContainer().UntilCommandIsCompleted("dotnet --version"));27        using (var testcontainers = testcontainersBuilder.Build())28        {29            testcontainers.Start();30            var response = testcontainers.ContainerInspectResponse;31            System.Console.WriteLine(response.NetworkSettings.Networks.Count);32        }33    }34}35using DotNet.Testcontainers.Containers.Builders;36using DotNet.Testcontainers.Containers.Modules;37using DotNet.Testcontainers.Containers.WaitStrategies;38{39    public static void Main()40    {41        var testcontainersBuilder = new TestcontainersBuilder<TestcontainersContainer>()42            .WithImage("mcr.microsoft.com/dotnet/core/sdk:3.1")43            .WithWaitStrategy(Wait.ForUnixContainer().UntilCommandIsCompleted("dotnet --version"));44        using (var testcontainers = testcontainersBuilder.Build())45        {46            testcontainers.Start();47            var response = testcontainers.ContainerInspectResponse;48            System.Console.WriteLine(response.NetworkSettings.Networks["bridge"].IPAddress);49        }50    }51}Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
