Как я могу вызвать результат теста во время выполнения в другой файл, чтобы обновить результат теста в testRail? - PullRequest
3 голосов
/ 25 марта 2020

Я использую MSTEST C# в селеновом веб-драйвере. Иерархия моего проекта:

Level1-MainProjectfile

     Level2-Properties

     Level2-Refernces

     Level2-AppObj(folder)

               Level3-DP(folder)

                        Level4-dpo.cs

                        Level4-dpc.cs

               Level3-TestRail(folder)

                         Level4-TestRailpm.cs

                         Level4-TestRailpo.cs

               Level3-gmethods.cs

      Level2-AUtomationCode.cs

      Level2-log4net.config

. Теперь в модуле AutomationCode.cs присутствуют тестовые примеры для моего модуля. Это основной файл проекта. Код в моем файле AutomationCode.cs:

    public class AutomationCode
    {
        private IWebDriver WDriver;
        private log4net.ILog Testlog;


        [TestInitialize]
        public void wd()
        {
            WDriver = Helper.GetWebDriver(helperconst.browserType.Chrome);
            Testlog = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        }
        [Priority(1)]
        [TestMethod]
        public void search()
        {
            Testlog.Info("Test ID:001, This test will select the criteria and update the customer dropdown");

            Testlog.Info("Step 1/1 : Select customer from cutomer dropdown");
            var dc = gmethods.GetSelectElement(WDriver, dpo.customermenu);
            dc.SelectByText(dpc.customer);
        }
///[Ignore]
        [Priority(2)]
        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod]
        public void TestRailCall()
        {
            TestRailpm a = new TestRailPM();
            a.testrail();
        }

        [TestCleanup]
        public void CleanUp()
        {
            WDriver.Close();
            WDriver.Quit();
        }
    }

На странице dpo:

public static class dpo
{
    public const string customermenu = "[data]";
}

На странице dp c

public static class dpc
{
    public const string customer = "A";
}

На странице gmethods:

static public SelectElement GetSelectElement(IWebDriver drv, string elem)
{
    SelectElement a = new SelectElement(drv.FindElement(By.CssSelector(elem)));
    return a;
}

В файле TestRailPO код

    namespace Automation.AppObj.TestRail
{
    public class TestRailPO
    {

        public class TestResultKeeper
        {
            public static TestResult TestResult { get; set; }
            public static UnitTestOutcome TestOutcome => UnitTestOutcome.Failed;

            //TestResult ?? Outcome ?? UnitTestOutcome.Failed;

            public static bool IsPassed => TestOutcome == UnitTestOutcome.Passed;
            public static Exception Exception { get; set; }


        }

        public class TestMethodAttribute : Attribute
        {
            public virtual TestResult[] Execute(ITestMethod testMethod)
            {
                return new TestResult[] { };
            }
        }

        public class LogTestTestMethod : TestMethodAttribute
        {

            public override TestResult[] Execute(ITestMethod testMethod)
            {
                var testResult = base.Execute(testMethod)[0];

                TestResultKeeper.TestResult = testResult;
                //TestResultKeeper.Exception = testResult.TestFailureException;

                return new[] { testResult };


            }

        }
    }

В testrailpm.cs код:

public class TestRailPM
{


    string testRailUrl = "https://test.testrail.io/";
    string testRailUser = "test@gmailcom";
    string testRailPassowrd = "test";
    int projectId = 1;
    int milestoneId = 1;
    int suiteId = 1;
    int testRailUserId = 1;
    string[] testCaseIds = { "12345", "21343" };


    public void testrail()
    {
        //Create Test Run in TestRail
        //Pass "true" against 'includeAll' parameter to insert all test cases in a suite; "false" to add specific test case id
        string testRunID = CreateTestRun.CreateRun(testRailUrl, testRailUser, testRailPassowrd, projectId, suiteId, milestoneId, "Automation of TestCases", "Automation of TestCases", testRailUserId, false, testCaseIds);
        int testRunIdInInt = Convert.ToInt16(testRunID);

        //Get TestCases Ids of a Run

        int[] newTestRunCaseIds = GetTestCases.getTestCaseIds(testRailUrl, testRailUser, testRailPassowrd, testRunIdInInt, true);
        int[] originalTestCaseIds = GetTestCases.getTestCaseIds(testRailUrl, testRailUser, testRailPassowrd, testRunIdInInt, false);

        //Add Result for Single Test Case in a Test Run
        /* testCaseStatus int The ID of the test status. The built-in test rail statuses have the following IDs:
        1 Passed
        2 Blocked
        3 Untested (not allowed when adding a result)
        4 Retest
        5 Failed
        */


        int singleTestCaseId = 716869;
        UpdateTestRun.updateSingleTestCaseInATestRun(testRailUrl, testRailUser, testRailPassowrd, testRunIdInInt, singleTestCaseId, TestContext.CurrentTestOutcome == UnitTestOutcome.Passed ? 1 : 5, "testCaseComments", testRailUserId);


        /*
        // Add Result for Multiple Test Cases in a Test Run at a time
        int[] testCaseIdsToUpdateResults = { 584003, 584004, 584005, 584006, 584007, 584008, 584009, 584075, 584076, 584213, 604458, 716869, 716870, 716871, 716872};
        int[] testCaseStatuses = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
        string[] testCaseComments = { "This case is passed", "This case is passed", "This case is passed", "This case is passed", "This case is passed", "This case is passed", "This case is passed", "This case is passed", "This case is passed", "This case is passed", "This case is passed", "This case is passed", "This case is passed", "This case is passed", "This case is passed"};
        UpdateTestRun.UpdateTestRunResults(testRailUrl, testRailUser, testRailPassowrd, testRunIdInInt, newTestRunCaseIds, testCaseStatuses, testCaseComments, testRailUserId);
        */


    }


}

Я использую MStest C#. Все, что я хочу, это запустить мой основной файл проекта, который является AutomationCode.cs, и результат теста, который будет "Pass / Fail", будет сохранен в переменной или атрибуте et c, который находится в файле TestRailpo.cs testkeeperresult или любой другой атрибут. Конечно, сохраненный результат будет либо успешным, либо неудачным, но здесь главное. Мне нужно передать этот результат в виде чисел, которые 1 или 5,1 для прохода и 5 для неудачи. Этот результат мне нужно передать в файле TestRailpm.cs в Resultoftestcase.

UpdateTestRun.updateSingleTestCaseInATestRun(testRailUrl, testRailUser, testRailPassowrd, testRunIdInInt, singleTestCaseId, Resultoftestcase, "testCaseComments", testRailUserId);
           }

Я вызвал метод TestRail () из файла TestRail.pm в AutomationCode.cs перед testcleanup, потому что я хочу обновить TestRail после того, как мои модульные тесты выполнены. Принимая во внимание мое подробное описание, пожалуйста, помогите мне в коде передать результат в виде 1 или 5 в файле testRail.pm. Скажите, пожалуйста, как мне это сделать и какие изменения потребуются?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Пожалуйста, добавьте свойство контекста теста в свой класс кода автоматизации, как показано ниже:

public class AutomationCode
    {
        private IWebDriver WDriver;
        private log4net.ILog Testlog;
        public TestContext TestContext { get; set; }
    }

Теперь добавьте приведенный ниже код в ваш метод cleanup (), вызовите метод, который обновит результат теста в TestRail. Примерно так:

[TestCleanup]
        public void CleanUp()
        {
            WDriver.Close();
            WDriver.Quit();

            TestRailpm a = new TestRailPM();

            if (TestContext.CurrentTestOutcome.Equals(UnitTestOutcome.Passed))
            {
                UTestResultKeeper.TestResult.Outcome = UnitTestOutcome.Passed;
                a.Resultoftestcase = "1";

            }
            else if (TestContext.CurrentTestOutcome.Equals(UnitTestOutcome.Failed)|| TestContext.CurrentTestOutcome.Equals(UnitTestOutcome.Timeout)|| TestContext.CurrentTestOutcome.Equals(UnitTestOutcome.Inconclusive))
            {
                TestResultKeeper.TestResult.Outcome = UnitTestOutcome.Failed;
                a.Resultoftestcase = "5";
            }
            //now that TestReultKeeper is updated wi can call the API method to update the test rail
            a.testrail();
        }

Я не уверен, можно ли получить доступ к свойству TestRailpm.Resultoftestcase или нет, так как вы не передали весь код, но я вызвал его напрямую, чтобы обновить свойство и позже обновить результат в Testrail.

Дайте мне знать, если это не сработает для вас, у меня есть более простой способ обновления testresil в testrail с использованием того же API-интерфейса testrail.

Более простой способ добиться этого загрузив TestRail API Client из здесь и затем обновив тестовые примеры testrail с помощью API тестовой шины

 public class UpdateTestResult
{
    /// <summary>
    /// Update the test result in testrail
    /// </summary>
    /// <param name="serverUrl">e.g. "http://<server>/testrail/</param>
    /// <param name="userName">username to be used</param>
    /// <param name="userPassword">password of the user</param>
    /// <param name="testCaseID">testrail test case ID</param>
    /// <param name="testResult">stauts of the test. e.g. :1 is passed and 5 is failed.</param>
    public void UpdateResultInTestRail(string serverUrl, string userName, string userPassword, string testCaseID, int testResult)
    {
        APIClient client = new APIClient("http://<server>/testrail/") { User = "userName", Password = "userPassword" };

        var data = new Dictionary<string, object>
                            {
                                { "status_id", testResult },
                                { "comment", "This test worked fine!" }
                            };

        client.SendPost("add_result/:"+ testCaseID, data);
    }
}

И теперь вы можете вызывать этот метод класса в методе очистки метода test. Примерно так:

        [TestCleanup]
    public void CleanUp()
    {
        UpdateTestResult updateResult = new UpdateTestResult();
        if (TestContext.CurrentTestOutcome.Equals(UnitTestOutcome.Passed))
        {
            updateResult.UpdateResultInTestRail("serverUrl", "username", "Password", "testcaseID", 1);
        }
        else if (TestContext.CurrentTestOutcome.Equals(UnitTestOutcome.Failed)|| TestContext.CurrentTestOutcome.Equals(UnitTestOutcome.Timeout)|| TestContext.CurrentTestOutcome.Equals(UnitTestOutcome.Inconclusive))
        {
            updateResult.UpdateResultInTestRail("serverUrl", "username", "Password", "testcaseID", 5);
        }
    }

Чтобы узнать больше об API testrail, вы можете обратиться по этой ссылке . Для получения результатов API вы можете ссылаться по этой ссылке .

0 голосов
/ 31 марта 2020

В принципе, это тот же вопрос, который вы задали здесь и здесь

Этот ответ дан ...

Для NUnit вы можете получить доступ к результату и другим деталям теста, используя свойства, найденные в TestContext.CurrentContext .

Для вашей проблемы вы можете добавить следующую проверку к метод разбора теста

if(TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Passed) { .... }

Для MSTest добавьте следующее свойство в ваш класс теста

public TestContext TestContext { get; set; } 

Затем используйте его, добавив следующее в TestCleanup

if(TestContext.CurrentTestOutcome == UnitTestOutcome.Passed) { .... }
...