Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Глюк в последовательности тестирования...

529  
Murr_0001 местный житель20.02.20 11:51
Murr_0001
20.02.20 11:51 

Глюк в последовательности тестирования...

Мой или общий пока не разобрался.


Суть - есть 6 аттрибутов для методов:

AssemblyInitialize

ClassInitialize

TestInitialize


и еще 3 - на очистку.


У меня два типа тестов - для тестовой базы и для живий базы.

Соответственно сделал два базовых класса - для тестовой и для живой.

В них прописано что делать перед тем как работать с классом тестов - меняется конфигурация подключения к базе.

Повешено это дело на ClassInitialize & TestInitialize


Проблема:

если написать ClassInitialize в классе самого теста - оно вызывается при инстанциации теста.

если тоже самое поместить в базовый класс - вызов пропускается...

Для TestInitialize все отрабатывает нормально в обоих случаях.


Чего пока не понимаю - это только у меня затык или всегда? Вроде как работало...


#1 
AlexNek патриот20.02.20 12:23
AlexNek
NEW 20.02.20 12:23 
в ответ Murr_0001 20.02.20 11:51

Любителям МС юнит посвящается flower миг

#2 
Программист коренной житель20.02.20 13:18
NEW 20.02.20 13:18 
в ответ Murr_0001 20.02.20 11:51
если написать 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


Так что все правильно :)

#3 
Murr_0001 местный житель20.02.20 16:07
Murr_0001
NEW 20.02.20 16:07 
в ответ Программист 20.02.20 13:18

И немножко по поводу фига...


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

}

}

}

#4 
Murr_0001 местный житель20.02.20 16:09
Murr_0001
NEW 20.02.20 16:09 
в ответ AlexNek 20.02.20 12:23

Могу и NUnit прописать - не проблема.смущ


#5 
Программист коренной житель20.02.20 17:09
NEW 20.02.20 17:09 
в ответ Murr_0001 20.02.20 16:07

Что ты хотел показать этим?

Метод декорированный аттрибутом ClassInitialize должен быть статическим. Перенеси этот метод из базового класса и ты получишь исключение.

#6 
AlexNek патриот20.02.20 18:02
AlexNek
NEW 20.02.20 18:02 
в ответ Murr_0001 20.02.20 16:09

Не проверял, но написано спок

https://nunit.org/docs/2.2.10/setup.html


#7 
Murr_0001 местный житель20.02.20 20:12
Murr_0001
NEW 20.02.20 20:12 
в ответ Программист 20.02.20 17:09

должен быть статическим.

-----

Видимо это Я в очередной раз проспал...

Спасибки.



Перенеси этот метод из базового класса и ты получишь исключение.

-----

Завтра подергаю...

#8 
Murr_0001 местный житель20.02.20 20:16
Murr_0001
NEW 20.02.20 20:16 
в ответ AlexNek 20.02.20 18:02

2.2.10

-----

С 3-какой-то уже подстегивается в МсТест и шуршит как обычно в НЮните...

#9 
AlexNek патриот20.02.20 20:35
AlexNek
NEW 20.02.20 20:35 
в ответ Murr_0001 20.02.20 20:16

не нашел отличий с 3.0 и больше смущ

https://github.com/nunit/docs/wiki/SetUpFixture-Attribute

#10 
Murr_0001 местный житель20.02.20 20:39
Murr_0001
NEW 20.02.20 20:39 
в ответ AlexNek 20.02.20 20:35

Я уже детали не помню.

Помню, что было много кода под НЮнит и Я его выполнял из Студии.

Помню еще, что там были компараторы которых нет в МсТест.

#11 
AlexNek патриот20.02.20 21:09
AlexNek
NEW 20.02.20 21:09 
в ответ Murr_0001 20.02.20 20:16

нифига не работает в базовом классе, только так

   [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...

#12 
AlexNek патриот20.02.20 21:28
AlexNek
NEW 20.02.20 21:28 
в ответ AlexNek 20.02.20 21:09

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");
        }
    }
}
#13