Глюк в последовательности тестирования...
Глюк в последовательности тестирования...
Мой или общий пока не разобрался.
Суть - есть 6 аттрибутов для методов:
AssemblyInitialize
ClassInitialize
TestInitialize
и еще 3 - на очистку.
У меня два типа тестов - для тестовой базы и для живий базы.
Соответственно сделал два базовых класса - для тестовой и для живой.
В них прописано что делать перед тем как работать с классом тестов - меняется конфигурация подключения к базе.
Повешено это дело на ClassInitialize & TestInitialize
Проблема:
если написать ClassInitialize в классе самого теста - оно вызывается при инстанциации теста.
если тоже самое поместить в базовый класс - вызов пропускается...
Для TestInitialize все отрабатывает нормально в обоих случаях.
Чего пока не понимаю - это только у меня затык или всегда? Вроде как работало...
если написать ClassInitialize в классе самого теста - оно вызывается при инстанциации теста.
если тоже самое поместить в базовый класс - вызов пропускается...
Для TestInitialize все отрабатывает нормально в обоих случаях.
Ясен фиг! Аттрибутом ClassInitialize декорируется статическая функция.
Проведем эксперимент:
public class Aaa { public static void Foo_Static() { } public void Foo () { } } public class Bbb : Aaa { }
И посмотрим, что нам доступно:
Type t = typeof(Bbb); foreach (var m in t.GetMethods()) { System.Diagnostics.Trace.WriteLine(m.Name); } System.Diagnostics.Trace.WriteLine("*******"); Type t1 = typeof(Aaa); foreach (var m in t1.GetMethods()) { System.Diagnostics.Trace.WriteLine(m.Name); }
Результат будет таким:
Foo Equals GetHashCode GetType ToString ******* Foo_Static Foo Equals GetHashCode GetType ToString
Так что все правильно :)
И немножко по поводу фига...
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Diagnostics;
namespace LiProdEx.Tests
{
[TestClass]
public class UnitTest1 : MyBase
{
[TestMethod]
public void TestMethod1()
{
}
}
public class MyBase
{
[TestInitialize]
public void TestInitialize_EachTest()
{
Debug.Print("TestInitialize_EachTest"); // ok
}
[TestCleanup]
public void TestCleanup_EachTest()
{
Debug.Print("TestCleanup_EachTest"); // ok
}
[ClassInitialize]
public void ClassInitialize_OnceOnClass()
{
Debug.Print("ClassInitialize_OnceOnClass"); // lost
}
[ClassCleanup]
public void ClassCleanup_OnceOnClass()
{
Debug.Print("ClassCleanup_OnceOnClass"); // lost
}
}
}
Что ты хотел показать этим?
Метод декорированный аттрибутом ClassInitialize должен быть статическим. Перенеси этот метод из базового класса и ты получишь исключение.
должен быть статическим.
-----
Видимо это Я в очередной раз проспал...
Спасибки.
Перенеси этот метод из базового класса и ты получишь исключение.
-----
Завтра подергаю...
Я уже детали не помню.
Помню, что было много кода под НЮнит и Я его выполнял из Студии.
Помню еще, что там были компараторы которых нет в МсТест.
нифига не работает в базовом классе, только так
[TestClass] public class MyTests : AnBase { [ClassInitialize] public static void ClassInitialize(TestContext par) { Debug.Print("Running ClassInitialize"); } [TestMethod] public void TestMethod1() { Debug.Print("Running TestMethod1....."); } [TestMethod] public void TestMethod2() { Debug.Print("Running TestMethod2....."); } [ClassCleanup] public static void ClassCleanup() { Debug.Print("Running ClassCleanup"); } } public class AnBase { [TestInitialize] public void TestInitialize() { Debug.Print("Running TestInitialize"); } [TestCleanup] public void TestCleanup() { Debug.Print("Running TestCleanup"); } }
результаты
TestMethod1() Debug Trace: Running ClassInitialize Running TestInitialize Running TestMethod1..... Running TestCleanup TestMethod2() Debug Trace: Running TestInitialize Running TestMethod2..... Running TestCleanup Running ClassCleanup
и еще отгребешь
https://developercommunity.visualstudio.com/content/proble...
NUnit без проблем
using System; using NUnit.Framework; namespace Test { [TestFixture] internal class Tests : AnBaseNu { [Test] public void Test1() { Console.WriteLine("Running Test1..."); } [Test] public void Test2() { Console.WriteLine("Running Test2..."); } } internal class AnBaseNu { [TearDown] public void Cleanup() { Console.WriteLine("Running TearDown"); } [OneTimeTearDown] public void CleanupOnce() { Console.WriteLine("Running OneTimeTearDown"); } [SetUp] public void Init() { Console.WriteLine("Running SetUp"); } [OneTimeSetUp] public void InitOnce() { Console.WriteLine("Running OneTimeSetUp"); } } }