Глюк в последовательности тестирования...
Глюк в последовательности тестирования...
Мой или общий пока не разобрался.
Суть - есть 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
}
}
}
нифига не работает в базовом классе, только так
[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");
}
}
}

