Как записать вывод в [ClassInitialize ()] класса модульного теста? - PullRequest
10 голосов
/ 07 декабря 2010

Я пишу некоторые модульные тесты для уровня персистентности моего приложения на C # .NET.До и после выполнения тестов тестового класса я хочу выполнить некоторую очистку, чтобы удалить возможно вставленные фиктивные значения , поэтому эта очистка происходит в методах, помеченных атрибутами [ClassInitialize()] и [ClassCleanup()].

(я знаю, что лучшим способом было бы использовать базу данных в памяти, но это не совсем выполнимо, поскольку мы зависим от множества хранимых процедур ....)

Я хотел бы вывести некоторую информацию о результатах очистки , но не могу найти способ получить выходные данные в результатах теста с VISUAL Studio 2010.

Это то, что я делаю до сих пор:

        ///... lots of stuff before ...

        //global for the test run
        private static TestContext context;

        //for each test
        private IRepository repo;

        #region Initialisation and cleanup

        /// <summary>
        /// Execute once before the test-suite
        /// </summary>
        [ClassInitialize()]
        public static void InitTestSuite(TestContext testContext)
        {
            context = testContext;    
            removeTestDataFromDb();    
        }

        [ClassCleanup()]
        public static void CleanupTestSuite()
        {
            removeTestDataFromDb();
        }

        private static void removeTestDataFromDb()
        {
            context.WriteLine("removeTestDataFromDb starting");
            using (ISession session = NHibernateHelper.OpenSession())
            {    
                IDbConnection cn = session.Connection;
                IDbCommand cmd = cn.CreateCommand();
                //remove anyt test data
                cmd.CommandText = @"DELETE FROM SomeTable
                    WHERE somefield LIKE 'easyToFindTestData%Test'";
                int res = cmd.ExecuteNonQuery();    
                context.WriteLine("removeTestDataFromDb done - affected {0} rows", res);
            }
        }


        [TestInitialize()]
        public void InitTest()
        {
            repo = new MyRepositoryImplementation();
        }

        [TestCleanup()]
        public void CleanupTest()
        {
            //cleanup       
            repo = null;
        }

        #endregion

Я пытаюсь использовать context.WriteLine () ...

Я такжепопробовал просто использовать Console.WriteLine () с теми же результатами.

Как записать в стандартный вывод в части ClassInitialize и где вы можете получить доступ к этому выводу?

Ответы [ 3 ]

17 голосов
/ 07 декабря 2010

[ClassInitialize] и [ClassCleanup] запускаются только один раз для всех тестов в этом классе.Вам лучше использовать [TestInitialize] и [TestCleanUp], которые выполняются до и после каждого теста.Также попробуйте включить полный тест в транзакцию базы данных.Таким образом, вы можете просто откатить операцию (не совершая транзакцию), и ваша база данных останется в согласованном состоянии (что важно для надежных автоматических тестов).

Уловка, которую я делаю для интеграционных тестов, состоит в определениибазовый класс, от которого могут наследоваться все мои классы тестов интеграции.Базовый класс обеспечивает выполнение каждого теста в транзакции и откат этой транзакции.Вот код:

public abstract class IntegrationTestBase
{
    private TransactionScope scope;

    [TestInitialize]
    public void TestInitialize()
    {
        scope = new TransactionScope();
    }

    [TestCleanup]
    public void TestCleanup()
    {
        scope.Dispose();
    }
}

Удачи.

1 голос
/ 17 декабря 2012

Вывод трассировки из ClassInitialize и ClassCleanup отображается в сводке результатов.

Вы можете получить к нему доступ, сделав следующее

  1. Открыть результаты теста windw [Тест -> Windows -> Результаты теста]
  2. В верхнем левом углу окна [Результаты теста] должна быть ссылка «Тестовый запуск завершен».
  3. Нажмите на клик
  4. Должно открыться окно с заголовком «Сводка результатов», и будет показана трассировка отладки, созданная во время ClassInitialize и ClassCleanup
0 голосов
/ 23 марта 2012

Вы можете увидеть вывод консоли на каждый тест, если дважды щелкнуть метод теста на панели «Результаты теста».Он также присутствует в файле результатов .trx xml.

Кроме того, если вы укажете «Определить константу отладки», вы можете использовать System.Diagnostics.Debug.WriteLine("ClassInitialize Method invoked, yeah."); .., что приведет к панели «Вывод».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...