private static void AddTests(ulong testRun)
        {
            var testsList = TestRail.GetTestList(testRun);

            if (testsList.Count == 0)
            {
                throw new Exception($"There are no tests in Run [{testRun}]");
            }

            foreach (var test in testsList)
            {
                foreach (var asm in Assemblies)
                {
                    MethodInfo method = null;

                    var tag       = TestRail.GetTag(test);
                    var tagVals   = tag.Split('@');
                    var funcName  = tagVals[0];
                    var funcParam = tagVals.Length > 1 ? tagVals[1] : null;
                    var caseId    = $"C{test.CaseID}";

                    var type = asm.Assembly.GetTypes().FirstOrDefault(x => (method = GetMethod(x, funcName, caseId)) != null);

                    if (type == null || method == null)
                    {
                        continue;
                    }

                    var methods        = type.GetMethods();
                    var setupMethod    = methods.FirstOrDefault(x => x.GetCustomAttributes().Any(atr => atr.GetType().Name == "SetUpAttribute"));
                    var teardownMethod = methods.FirstOrDefault(x => x.GetCustomAttributes().Any(atr => atr.GetType().Name == "TearDownAttribute"));

                    asm.TestsList.Add(new TestInfo()
                    {
                        TestRailInfo   = test,
                        TestClass      = type,
                        TestMethod     = method,
                        SetupMethod    = setupMethod,
                        TeardownMethod = teardownMethod,
                        FuncParam      = funcParam
                    });
                }
            }
        }
        private static void RunTest(global::TestRail.Types.Test test)
        {
            MethodInfo method = null;

            var tag          = TestRail.GetTag(test);
            var tagDelimiter = '@';
            var tagVals      = tag.Split(tagDelimiter);

            var funcName  = tag.Contains(tagDelimiter) ? tagVals[0] : tag;
            var funcParam = tag.Contains(tagDelimiter) ? tagVals[1] : null;

            var caseId    = $"C{test.CaseID}";
            var screenUrl = TeamCity.GetScreenUrl();

            Program.Logger.Info($" +++++ Run:  {funcName}-{funcParam??""}, {caseId}, {screenUrl}");

            try
            {
                var type = Asm.GetTypes().First(x => (method = GetMethod(x, funcName, caseId)) != null);

                if (type == null)
                {
                    throw new Exception("[Type] is not defined.");
                }

                if (method == null)
                {
                    throw new Exception("[Method] is not defined.");
                }

                var classInstance = Activator.CreateInstance(type);

                var setupMethod =
                    type.GetMethods()
                    .FirstOrDefault(x => x.GetCustomAttributes().Any(atr => atr.GetType().Name == "SetUpAttribute"));
                var teardownMethod =
                    type.GetMethods()
                    .FirstOrDefault(
                        x => x.GetCustomAttributes().Any(atr => atr.GetType().Name == "TearDownAttribute"));

                if (setupMethod != null)
                {
                    ExecMethod(classInstance, setupMethod);
                }

                ExecMethod(classInstance, method, funcParam);

                //if (teardownMethod != null)
                //    ExecMethod(type, teardownMethod);

                TestRail.SetResult(test, ResultStatus.Passed);
                Program.Logger.Info("Success:");
            }
            catch (Exception e)
            {
                if (method == null)
                {
                    TestRail.SetResult(test, ResultStatus.Failed, e.Message);
                    Program.Logger.Info($"Error: {e.Message}");
                    return;
                }

                var screeenFile = $"{screenUrl}/{method.Name}.png";
                var exc         = e.InnerException ?? e;

                var message = exc.Message + Environment.NewLine +
                              screeenFile + Environment.NewLine +
                              exc.StackTrace + Environment.NewLine;

                Program.Logger.Info($"Error: {message}");
                TestRail.SetResult(test, ResultStatus.Failed, message);

                WebDriverHelper.CreateScreenshot(method.Name, false);
            }
        }