Best NBi code snippet using NBi.Core.ResultSet.Resolver.ResultSetResolverArgs
ResultSetResolverArgsBuilder.cs
Source:ResultSetResolverArgsBuilder.cs  
...25using System.Threading.Tasks;26using NBi.Xml.Items.Alteration;27namespace NBi.NUnit.Builder.Helper28{29    class ResultSetResolverArgsBuilder30    {31        private bool isSetup = false;32        private object obj = null;33        private SettingsXml settings = null;34        private SettingsXml.DefaultScope scope = SettingsXml.DefaultScope.Everywhere;35        private IDictionary<string, IVariable> Variables { get; set; } = new Dictionary<string, IVariable>();36        private ResultSetResolverArgs args = null;37        private ServiceLocator ServiceLocator { get; }38        public ResultSetResolverArgsBuilder(ServiceLocator serviceLocator) => this.ServiceLocator = serviceLocator;39        public void Setup(object obj, SettingsXml settingsXml, SettingsXml.DefaultScope scope, IDictionary<string, IVariable> variables)40        {41            this.obj = obj;42            this.settings = settingsXml;43            this.scope = scope;44            this.Variables = variables;45            isSetup = true;46        }47        public void Build()48        {49            if (!isSetup)50                throw new InvalidOperationException();51            switch (obj)52            {53                case ResultSetSystemXml x: args = BuildResultSetSystemXml(x); break;54                case ResultSetXml x: args = BuildResultSetXml(x); break;55                case IfMissingXml x when !(x?.File?.IsEmpty() ?? false): args = BuildFlatFileResultSetResolverArgs(x.File); break;56                case QueryXml x: args = BuildQueryResolverArgs(x, scope); break;57                case XmlSourceXml x: args = BuildXPathResolverArgs(x); break;58                case JsonSourceXml x: args = BuildJsonPathResolverArgs(x); break;59                default: throw new ArgumentException();60            }61        }62        private ResultSetResolverArgs BuildResultSetSystemXml(ResultSetSystemXml xml)63        {64            if (xml?.IfUnavailable?.ResultSet != null)65                return BuildIfUnavaibleResultSetResolverArgs(BuildInternalResultSetSystemXml(xml), BuildResultSetSystemXml(xml.IfUnavailable.ResultSet));66            else67                return BuildInternalResultSetSystemXml(xml);68        }69        private ResultSetResolverArgs BuildInternalResultSetSystemXml(ResultSetSystemXml xml)70        {71            //ResultSet (external flat file)72            if (!xml?.File?.IsEmpty() ?? false)73                return BuildFlatFileResultSetResolverArgs(xml.File);74            //Query75            else if (xml.Query != null)76                return BuildQueryResolverArgs(xml.Query, scope);77            else if (xml.SequenceCombination != null)78                return BuildSequenceCombinationResolverArgs(xml.SequenceCombination);79            else if (xml.Sequence != null)80                return BuildSequenceResolverArgs(xml.Sequence);81            else if (xml.XmlSource != null)82                return BuildXPathResolverArgs(xml.XmlSource);83            else if (xml.JsonSource != null)84                return BuildJsonPathResolverArgs(xml.JsonSource);85            else if (xml.Empty != null)86                return BuildEmptyResolverArgs(xml.Empty);87            else if (xml.Iteration != null)88                return BuildIterativeResultSetResolverArgs(xml.Iteration, xml.NestedResultSet);89            else if (xml.Rows != null)90                return BuildEmbeddedResolverArgs(xml.Content);91            throw new ArgumentException();92        }93        private ResultSetResolverArgs BuildResultSetXml(ResultSetXml xml)94        {95            //ResultSet (external flat file)96            if (!string.IsNullOrEmpty(xml.File))97            {98                ParseFileInfo(xml.File, out var filename, out var parserName);99                if (string.IsNullOrEmpty(parserName))100                    return BuildFlatFileResultSetResolverArgs(new FileXml() { Path = filename });101                else102                    return BuildFlatFileResultSetResolverArgs(new FileXml() { Path = filename, Parser = new ParserXml() { Name = parserName } });103            }104            //ResultSet (embedded)105            else if (xml.Rows != null)106                return BuildEmbeddedResolverArgs(xml.Content);107            throw new ArgumentException();108        }109        private ResultSetResolverArgs BuildSequenceCombinationResolverArgs(SequenceCombinationXml sequenceCombinationXml)110        {111            var resolvers = new List<ISequenceResolver>();112            var sequenceFactory = new SequenceResolverFactory(ServiceLocator);113            var builder = new SequenceResolverArgsBuilder(ServiceLocator);114            builder.Setup(settings);115            builder.Setup(Variables);116            foreach (var sequenceXml in sequenceCombinationXml.Sequences)117            {118                builder.Setup(sequenceXml.Type);119                builder.Setup((object)sequenceXml.SentinelLoop ?? sequenceXml.Items);120                builder.Build();121                resolvers.Add(sequenceFactory.Instantiate(sequenceXml.Type, builder.GetArgs()));122            }123            return new SequenceCombinationResultSetResolverArgs(resolvers);124        }125        private ResultSetResolverArgs BuildSequenceResolverArgs(SequenceXml sequenceXml)126        {127            var sequenceFactory = new SequenceResolverFactory(ServiceLocator);128            var builder = new SequenceResolverArgsBuilder(ServiceLocator);129            builder.Setup(settings);130            builder.Setup(Variables);131            builder.Setup(sequenceXml.Type);132            builder.Setup((object)sequenceXml.SentinelLoop ?? sequenceXml.Items);133            builder.Build();134            var resolver = sequenceFactory.Instantiate(sequenceXml.Type, builder.GetArgs());135            return new SequenceResultSetResolverArgs(resolver);136        }137        private void ParseFileInfo(string input, out string filename, out string parserName)138        {139            var split = input.Split(new char[] { '!' }, StringSplitOptions.RemoveEmptyEntries);140            filename = split[0];141            parserName = split.Count() == 1 ? string.Empty : split[1];142        }143        private ResultSetResolverArgs BuildEmbeddedResolverArgs(IContent content)144        {145            Trace.WriteLineIf(Extensibility.NBiTraceSwitch.TraceVerbose, "ResultSet defined in embedded resultSet.");146            return new ContentResultSetResolverArgs(content);147        }148        private ResultSetResolverArgs BuildIterativeResultSetResolverArgs(IterationXml iterationXml, ResultSetSystemXml nestedResultSetXml)149        {150            var sequenceFactory = new SequenceResolverFactory(ServiceLocator);151            var builder = new SequenceResolverArgsBuilder(ServiceLocator);152            builder.Setup(settings);153            builder.Setup(Variables);154            builder.Setup(iterationXml.Sequence.Type);155            builder.Setup((object)iterationXml.Sequence.SentinelLoop ?? iterationXml.Sequence.Items);156            builder.Build();157            var sequenceResolver = sequenceFactory.Instantiate(iterationXml.Sequence.Type, builder.GetArgs());158            var nestedHelper = new ResultSetSystemHelper(ServiceLocator, scope, Variables);159            nestedResultSetXml.Settings = settings;160            var nestedResultSetResolver = nestedHelper.InstantiateResolver(nestedResultSetXml);161            return new IterativeResultSetResolverArgs(sequenceResolver, iterationXml.Sequence.Name, Variables, nestedResultSetResolver);162        }163        private ResultSetResolverArgs BuildQueryResolverArgs(QueryXml queryXml, SettingsXml.DefaultScope scope)164        {165            Trace.WriteLineIf(Extensibility.NBiTraceSwitch.TraceVerbose, "ResultSet defined through a query.");166            var argsBuilder = new QueryResolverArgsBuilder(ServiceLocator);167            argsBuilder.Setup(queryXml, settings, scope, Variables);168            argsBuilder.Build();169            var argsQuery = argsBuilder.GetArgs();170            return new QueryResultSetResolverArgs(argsQuery);171        }172        private ResultSetResolverArgs BuildFlatFileResultSetResolverArgs(FileXml fileMetadata)173        {174            Trace.WriteLineIf(Extensibility.NBiTraceSwitch.TraceVerbose, $"ResultSet defined in an external flat file to be read with {(string.IsNullOrEmpty(fileMetadata.Parser?.Name) ? "the default CSV parser" : fileMetadata.Parser?.Name)}.");175            var helper = new ScalarHelper(ServiceLocator, settings, scope, new Context(Variables));176            var resolverPath = helper.InstantiateResolver<string>(fileMetadata.Path);177            if (fileMetadata.IfMissing == null)178                return new FlatFileResultSetResolverArgs(resolverPath, settings?.BasePath, fileMetadata.Parser?.Name, settings?.CsvProfile);179            var builder = new ResultSetResolverArgsBuilder(ServiceLocator);180            builder.Setup(fileMetadata.IfMissing, settings, scope, Variables);181            builder.Build();182            var redirection = builder.GetArgs();183            var factory = new ResultSetResolverFactory(ServiceLocator);184            var resolver = factory.Instantiate(redirection);185            return new FlatFileResultSetResolverArgs(resolverPath, settings?.BasePath, fileMetadata.Parser?.Name, resolver, settings?.CsvProfile);186        }187        private ResultSetResolverArgs BuildXPathResolverArgs(XmlSourceXml xmlSource)188        {189            Trace.WriteLineIf(Extensibility.NBiTraceSwitch.TraceVerbose, "ResultSet defined through an xml-source.");190            var helper = new ScalarHelper(ServiceLocator, settings, scope, new Context(Variables));191            IReaderArgs reader = null;192            if (xmlSource.File != null)193            {194                var resolverPath = helper.InstantiateResolver<string>(xmlSource.File.Path);195                reader = new FileReaderArgs(settings?.BasePath, resolverPath);196            }197            else if (xmlSource.Url != null)198            {199                var resolverUrl = helper.InstantiateResolver<string>(xmlSource.Url.Value);200                reader = new UrlReaderArgs(resolverUrl);201            }202            else if (xmlSource.Rest != null)203            {204                var restHelper = new RestHelper(ServiceLocator, settings, scope, Variables);205                reader = new RestReaderArgs(restHelper.Execute(xmlSource.Rest));206            }207            var selects = new List<IPathSelect>();208            var selectFactory = new PathFlattenizerFactory();209            foreach (var select in xmlSource.XPath.Selects)210                selects.Add(selectFactory.Instantiate(helper.InstantiateResolver<string>(select.Value), select.Attribute, select.Evaluate));211            var flattenizer = new XPathArgs212            {213                From = helper.InstantiateResolver<string>(xmlSource.XPath.From.Value),214                Selects = selects,215                DefaultNamespacePrefix = xmlSource.XPath?.DefaultNamespacePrefix,216                IsIgnoreNamespace = xmlSource.IgnoreNamespace217            };218            return new DataSerializationResultSetResolverArgs(reader, flattenizer);219        }220        private ResultSetResolverArgs BuildJsonPathResolverArgs(JsonSourceXml jsonSource)221        {222            Trace.WriteLineIf(Extensibility.NBiTraceSwitch.TraceVerbose, "ResultSet defined through an json-source.");223            var context = new Context(Variables);224            var helper = new ScalarHelper(ServiceLocator, settings, scope, context);225            IReaderArgs reader = null;226            if (jsonSource.File != null)227            {228                var resolverPath = helper.InstantiateResolver<string>(jsonSource.File.Path);229                reader = new FileReaderArgs(settings?.BasePath, resolverPath);230            }231            else if (jsonSource.Url != null)232            {233                var resolverUrl = helper.InstantiateResolver<string>(jsonSource.Url.Value);234                reader = new UrlReaderArgs(resolverUrl);235            }236            else if (jsonSource.Rest != null)237            {238                var restHelper = new RestHelper(ServiceLocator, settings, scope, Variables);239                reader = new RestReaderArgs(restHelper.Execute(jsonSource.Rest));240            }241            else if (jsonSource.QueryScalar != null)242            {243                var builder = new ScalarResolverArgsBuilder(ServiceLocator, context);244                builder.Setup(jsonSource.QueryScalar, settings, scope);245                builder.Build();246                var args = ServiceLocator.GetScalarResolverFactory().Instantiate<string>(builder.GetArgs());247                reader = new ScalarReaderArgs(args);248            }249            var selects = new List<IPathSelect>();250            var selectFactory = new PathFlattenizerFactory();251            foreach (var select in jsonSource.JsonPath.Selects)252                selects.Add(selectFactory.Instantiate(helper.InstantiateResolver<string>(select.Value), string.Empty, false));253            var flattenizer = new JsonPathArgs254            {255                From = helper.InstantiateResolver<string>(jsonSource.JsonPath.From.Value),256                Selects = selects,257            };258            return new DataSerializationResultSetResolverArgs(reader, flattenizer);259        }260        private ResultSetResolverArgs BuildEmptyResolverArgs(EmptyResultSetXml empty)261        {262            var scalarHelper = new ScalarHelper(ServiceLocator, settings, scope, new Context(Variables));263            if (empty.Columns.Count > 0 && !string.IsNullOrEmpty(empty.ColumnCount))264                return new EmptyResultSetResolverArgs(empty.Columns.Select(x => x.Identifier as ColumnNameIdentifier), scalarHelper.InstantiateResolver<int>(empty.ColumnCount));265            else if (empty.Columns.Count > 0)266                return new EmptyResultSetResolverArgs(empty.Columns.Select(x => x.Identifier as ColumnNameIdentifier));267            else if (!string.IsNullOrEmpty(empty.ColumnCount))268                return new EmptyResultSetResolverArgs(scalarHelper.InstantiateResolver<int>(empty.ColumnCount));269            else270                throw new ArgumentNullException();271        }272        private ResultSetResolverArgs BuildIfUnavaibleResultSetResolverArgs(ResultSetResolverArgs primaryArgs, ResultSetResolverArgs secondaryArgs)273        {274            var factory = ServiceLocator.GetResultSetResolverFactory();275            var primary = factory.Instantiate(primaryArgs);276            var secondary = factory.Instantiate(secondaryArgs);277            return new IfUnavailableResultSetResolverArgs(primary, secondary);278        }279        public ResultSetResolverArgs GetArgs() => args;280    }281}...IterativeResultSetResolverArgs.cs
Source:IterativeResultSetResolverArgs.cs  
...7using System.Text;8using System.Threading.Tasks;9namespace NBi.Core.ResultSet.Resolver10{11    public class IterativeResultSetResolverArgs : ResultSetResolverArgs12    {13        public IResultSetResolver ResultSetResolver { get; }14        public ISequenceResolver SequenceResolver { get; }15        public IMergingEngine MergingEngine { get; }16        public string VariableName { get; }17        public IDictionary<string, IVariable> Variables { get; }18        public IterativeResultSetResolverArgs(ISequenceResolver sequenceResolver, string variableName, IDictionary<string, IVariable> variables, IResultSetResolver resultSetResolver)19        {20            SequenceResolver = sequenceResolver;21            ResultSetResolver = resultSetResolver;22            MergingEngine = new UnionByOrdinalEngine(new ResultSetService(resultSetResolver.Execute, null));23            Variables = variables;24            VariableName = variableName;25        }26    }27}...ProjectionResultSetScalarResolverArgs.cs
Source:ProjectionResultSetScalarResolverArgs.cs  
...9{10    public abstract class ProjectionResultSetScalarResolverArgs : IScalarResolverArgs11    {12        public Func<IResultSet, object> Projection { get; }13        public ResultSetResolverArgs ResultSetArgs { get; }14        public ProjectionResultSetScalarResolverArgs(Func<IResultSet, object> projection, ResultSetResolverArgs resultSetArgs)15        {16            Projection = projection;17            ResultSetArgs = resultSetArgs;18        }19    }20}...ResultSetResolverArgs
Using AI Code Generation
1using NBi.Core.ResultSet.Resolver;2using System.Data;3using NBi.Core.ResultSet;4using NBi.Core.ResultSet.Resolver;5using System.Data;6using NBi.Core.ResultSet;7using NBi.Core.ResultSet.Resolver;8using System.Data;9using NBi.Core.ResultSet;10using NBi.Core.ResultSet.Resolver;11using System.Data;12using NBi.Core.ResultSet;13using NBi.Core.ResultSet.Resolver;14using System.Data;15using NBi.Core.ResultSet;16using NBi.Core.ResultSet.Resolver;17using System.Data;18using NBi.Core.ResultSet;19using NBi.Core.ResultSet.Resolver;20using System.Data;21using NBi.Core.ResultSet;22using NBi.Core.ResultSet.Resolver;23using System.Data;24using NBi.Core.ResultSet;25using NBi.Core.ResultSet.Resolver;26using System.Data;27using NBi.Core.ResultSet;28using NBi.Core.ResultSet.Resolver;29using System.Data;30using NBi.Core.ResultSet;31using NBi.Core.ResultSet.Resolver;32using System.Data;33using NBi.Core.ResultSet;34using NBi.Core.ResultSet.Resolver;35using System.Data;36using NBi.Core.ResultSet;37using NBi.Core.ResultSet.Resolver;38using System.Data;39using NBi.Core.ResultSet;40using NBi.Core.ResultSet.Resolver;41using System.Data;42using NBi.Core.ResultSet;43using NBi.Core.ResultSet.Resolver;ResultSetResolverArgs
Using AI Code Generation
1using NBi.Core.ResultSet.Resolver;2using NBi.Core.ResultSet;3using NBi.Core.Calculation;4using NBi.Core;5using System;6using System.Collections.Generic;7using System.Linq;8using System.Text;9using System.Threading.Tasks;10using System.Data;11using System.Data.SqlClient;12using System.Diagnostics;13using System.Data.OleDb;14using System.IO;15using System.Data.Common;16using NBi.Core.ResultSet.Comparer;17using NBi.Core.ResultSet.Equivalence;18using NBi.Core.ResultSet.Lookup;19using NBi.Core.ResultSet.Lookup.Violation;20using NBi.Core.ResultSet.Lookup.Strategy;21{22    {23        static void Main(string[] args)24        {25            var args1 = new ResultSetResolverArgs();26            args1.ResultSet = new ResultSet();27            args1.ResultSet.Load(new DataTableReader(getdata()));ResultSetResolverArgs
Using AI Code Generation
1using NBi.Core.ResultSet.Resolver;2using NBi.Core.ResultSet;3using System.Data;4using System.Collections.Generic;5using System;6using NBi.Core.ResultSet.Lookup.Violation;7using NBi.Core.ResultSet.Lookup;8{9    public ResultSetResolverArgs()10    {11        ColumnType = ColumnType.Numeric;12        ComparisonType = ComparisonType.Equal;13        Tolerance = 0;14        ToleranceType = ToleranceType.Absolute;15        TolerancePercent = false;16        IgnoreCase = false;17        IgnoreWhiteSpaces = false;18        IgnoreNull = false;19        IgnoreBlanks = false;20        KeyColumns = new List<int>();21        ValueColumns = new List<int>();22        Filter = new List<FilterArgs>();23        OrderBy = new List<OrderByArgs>();24        GroupBy = new List<GroupByArgs>();25        Lookup = new List<LookupArgs>();26        ViolationManager = new List<ViolationManagerArgs>();27    }28    public ColumnType ColumnType { get; set; }29    public ComparisonType ComparisonType { get; set; }30    public double Tolerance { get; set; }31    public ToleranceType ToleranceType { get; set; }32    public bool TolerancePercent { get; set; }33    public bool IgnoreCase { get; set; }34    public bool IgnoreWhiteSpaces { get; set; }35    public bool IgnoreNull { get; set; }36    public bool IgnoreBlanks { get; set; }37    public List<int> KeyColumns { get; set; }38    public List<int> ValueColumns { get; set; }39    public List<FilterArgs> Filter { get; set; }40    public List<OrderByArgs> OrderBy { get; set; }41    public List<GroupByArgs> GroupBy { get; set; }42    public List<LookupArgs> Lookup { get; set; }43    public List<ViolationManagerArgs> ViolationManager { get; set; }44}45using System;46using System.Collections.Generic;47using System.Linq;48using System.Text;49using System.Threading.Tasks;50{51    {52        public FilterArgs()53        {54            ColumnIndex = -1;ResultSetResolverArgs
Using AI Code Generation
1using NBi.Core.ResultSet.Resolver;2using System.Data;3{4    {5        public bool Execute(ResultSetResolverArgs args)6        {7        }8    }9}10using MyNamespace;11using NBi.Core.ResultSet;12using NBi.Core.ResultSet.Resolver;13using NBi.Core.Calculation;14using NBi.Core.Calculation.Grouping;15using NBi.Core.Calculation.Ranking;16using NBi.Core.Calculation.Predicate;17using NBi.Core.Calculation.Function;18using NBi.Core.Sequence.Resolver;19using NBi.Core.Sequence;20using NBi.Core.Variable;21using NBi.Core.Scalar.Resolver;22using NBi.Core.Scalar;23using System.Collections.Generic;24using System.Data;25using System;26using System.Linq;27using NBi.Core.Injection;28using NBi.Core;29using NBi.Core.Transformation;30using NBi.Core.Transformation.Transformer.Native;31using NBi.Core.Transformation.Transformer;32using NBi.Core.ResultSet.Lookup.Violation;33using NBi.Core.ResultSet.Lookup;34using NBi.Core.ResultSet.Comparer;35using NBi.Core.ResultSet.Alteration.Duplication;36using NBi.Core.ResultSet.Alteration.Renaming;37using NBi.Core.ResultSet.Alteration.Projection;38using NBi.Core.ResultSet.Alteration.Duplication.Strategy;39using NBi.Core.ResultSet.Alteration;40using NBi.Core.ResultSet.Alteration.Extension;41using NBi.Core.ResultSet.Alteration.Extension.Strategy;42using NBi.Core.ResultSet.Alteration.Extension.Construction;43using NBi.Core.ResultSet.Alteration.Extension.Construction.Strategy;44using NBi.Core.ResultSet.Alteration.Extension.Construction.Combination;45using NBi.Core.ResultSet.Alteration.Extension.Construction.Combination.Strategy;46using NBi.Core.ResultSet.Alteration.Extension.Construction.Combination.Calculator;47using NBi.Core.ResultSet.Alteration.Extension.Construction.Combination.Calculator.Strategy;48using NBi.Core.ResultSet.Alteration.Extension.Construction.Combination.Calculator.Calculator;49using NBi.Core.ResultSet.Alteration.Extension.Construction.Combination.Calculator.Calculator.Strategy;50using NBi.Core.ResultSet.Alteration.Extension.Construction.Combination.Calculator.Calculator.Calculator;ResultSetResolverArgs
Using AI Code Generation
1var args = new ResultSetResolverArgs();2args.ResultSet = new ResultSet();3args.ResultSet.Load(rs);4args.ResultSet.BuildIndex();5var resolver = new ResultSetUniqueRowsResolver(args);6Assert.That(resolver.Execute(), Is.True);7var args = new ResultSetResolverArgs();8args.ResultSet = new ResultSet();9args.ResultSet.Load(rs);10args.ResultSet.BuildIndex();11var resolver = new ResultSetUniqueRowsResolver(args);12Assert.That(resolver.Execute(), Is.True);13var args = new ResultSetResolverArgs();14args.ResultSet = new ResultSet();15args.ResultSet.Load(rs);16args.ResultSet.BuildIndex();17var resolver = new ResultSetUniqueRowsResolver(args);18Assert.That(resolver.Execute(), Is.True);19var args = new ResultSetResolverArgs();20args.ResultSet = new ResultSet();21args.ResultSet.Load(rs);22args.ResultSet.BuildIndex();23var resolver = new ResultSetUniqueRowsResolver(args);24Assert.That(resolver.Execute(), Is.True);25var args = new ResultSetResolverArgs();26args.ResultSet = new ResultSet();27args.ResultSet.Load(rs);28args.ResultSet.BuildIndex();29var resolver = new ResultSetUniqueRowsResolver(args);30Assert.That(resolver.Execute(), Is.True);31var args = new ResultSetResolverArgs();32args.ResultSet = new ResultSet();33args.ResultSet.Load(rs);34args.ResultSet.BuildIndex();35var resolver = new ResultSetUniqueRowsResolver(args);36Assert.That(resolver.Execute(), Is.True);37var args = new ResultSetResolverArgs();38args.ResultSet = new ResultSet();39args.ResultSet.Load(rs);40args.ResultSet.BuildIndex();41var resolver = new ResultSetUniqueRowsResolver(args);42Assert.That(resolver.Execute(), Is.True);43var args = new ResultSetResolverArgs();44args.ResultSet = new ResultSet();45args.ResultSet.Load(rs);46args.ResultSet.BuildIndex();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!!
