NUnit, не повинуясь наследованию атрибута

У меня есть проблема с NUnit - задающийся вопросом, есть ли у кого-либо какие-либо идеи.

Мы используем NUnit 2.5.3.9345 и C# 3.5.

Возьмите следующий код:

public class UnitTestBase
{
    [TestFixtureSetUp]
    public void SetUpTestFixture()
    {
        //Do something in base
    }
}

[TestFixture]
public class SomeTestClass : UnitTestBase
{
    [TestFixtureSetUp]
    public void FixtureSetUp()
    {
        //Do something in test class
    }

    [Test]
    public void SomeTest()
    {
        //Some assertion
    }
}

Согласно документации, если я работаю SomeTestClass.SomeTest(), UnitTestBase.SetUpTestFixture() должен быть назван прежде SomeTestClass.FixtureSetUp().

Это не имеет место - базовый метод только назовут, если я не обеспечу a [TestFixtureSetUp] метод в производном классе.

Какие-либо идеи? Озадачили меня действительно!

Спасибо.

11
задан David Schmitt 24 February 2010 в 07:40
поделиться

5 ответов

У меня нет этой проблемы. Я протестировал результат со следующим:

Derived Test

[TestFixture]
public class DerivedTest : TestBase
{

    [TestFixtureSetUp]
    public void FixtureSetup()
    {

        File.AppendAllText("Out.txt", string.Format("TestFixtureSetUp From DerivedTest{0}", Environment.NewLine));
    }

    [TestFixtureTearDown]
    public void FixtureTearDown()
    {
        File.AppendAllText("Out.txt", string.Format("TestFixtureTearDown Down From DerivedTest{0}", Environment.NewLine));
    }

    [SetUp]
    public void Setup()
    {
        File.AppendAllText("Out.txt", string.Format("Setup From DerivedTest{0}", Environment.NewLine));
    }
    [TearDown]
    public void Down()
    {
        File.AppendAllText("Out.txt", string.Format("TearDown From DerivedTest{0}", Environment.NewLine));
    }

    [Test]
    public void DoATest()
    {
        File.AppendAllText("Out.txt", string.Format("Did a Test{0}", Environment.NewLine));
    }
}

TestBase

public class TestBase
{

    [TestFixtureSetUp]
    public void BaseTestFixtureSetUp()
    {
        File.AppendAllText("Out.txt", string.Format("TestFixtureSetUp From TestBase{0}", Environment.NewLine));
    }

    [TestFixtureTearDown]
    public void BaseTestFixtureTearDown()
    {
        File.AppendAllText("Out.txt", string.Format("TestFixtureTearDown From TestBase{0}", Environment.NewLine));
    }

    [SetUp]
    public void BaseSetup()
    {
        File.AppendAllText("Out.txt", string.Format("Setup From TestBase{0}", Environment.NewLine));
    }

    [TearDown]
    public void TearDown()
    {
        File.AppendAllText("Out.txt", string.Format("TearDown From TestBase{0}", Environment.NewLine));
    }
}

Это дает следующий результат:

TestFixtureSetUp From TestBase
TestFixtureSetUp From DerivedTest
Setup From TestBase
Setup From DerivedTest
Did a Test
TearDown From DerivedTest
TearDown From TestBase
TestFixtureTearDown Down From DerivedTest
TestFixtureTearDown From TestBase

Я смог протестировать результат с ReSharper 5 beta и Nunit GUI v 2.5.3.9345 (32-bit)

Edit На работе прогонщик тестов в ReSharper 4.5 не работал должным образом, однако запуск собранного тестового проекта в x86 и x64 с соответствующим NUnit.exe/NUnit-86.exe выдал корректный результат.

2
ответ дан 3 December 2019 в 12:05
поделиться

Вы можете беспокоиться об этом. К сожалению, я не думаю, что это возможно сделать на 100% безопасно ни при одной из низкоуровневых привязок SSL/TLS, которые я искал для Perl.

По существу, вам необходимо передать имя хоста сервера, который вы хотите подключить к библиотеке SSL, до того, как начнется квитирование. Кроме того, можно организовать обратный вызов в нужный момент и прервать квитирование изнутри обратного вызова, если он не выдан. Люди, пишущие привязки Perl к OpenSSL, казалось, имели проблемы, заставляя интерфейс обратного вызова последовательно.

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

Возможно, вам потребуется проверить наличие привязок к библиотеке Netscape/Mozilla NSS. Это показалось довольно хорошим в этом, когда я посмотрел на это.

-121--1133019-

Есть ли определенный способ, C99 определить, была ли моя функция передана строковым литералом, чтобы я мог вернуться, не пытаясь его NUL?

Вы не должны.

Ваш API не должен пытаться замять вещи для вызывающего абонента, только чтобы он сломался позже. Если вызывающий абонент нарушает правила, он должен выяснить, тогда и там.

Если вызывающая сторона передает не изменяемую строку функции, которая ожидает изменяемую строку, она должна segfault. Все остальное - плохой дизайн.

(Добавление: Наилучшая конструкция, конечно, будет заключаться в возврате копии строки, за освобождение которой отвечает вызывающий абонент.)

-121--4817397-

Обходной путь/другой способ:

Вместо того, чтобы полагаться на поведение, которое не является сразу ясным, сделайте что-то подобное вместо этого с помощью шаблона шаблона метода, чтобы сделать порядок явным, используя обычные языковые особенности:

public class UnitTestBase
{
    protected abstract void PerFixtureSetUp();

    [TestFixtureSetUp]
    public void SetUpTestFixture()
    {
        PerFixtureSetUp();
    }
}

[TestFixture]
public class SomeTestClass : UnitTestBase
{
    protected override void PerFixtureSetUp()
    {

    }

    [Test]
    public void SomeTest()
    {
        //Some assertion
    }
}

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

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

1
ответ дан 3 December 2019 в 12:05
поделиться

Пробовали ли вы дать базовому классу атрибут [TestFixture]? Я не знаю, что это исправит ситуацию, но, кажется, стоит попробовать... идея в том, что NUnit может игнорировать атрибуты базового класса, если он не TestFixture.

0
ответ дан 3 December 2019 в 12:05
поделиться

Байты с первым битом, равным 0, являются обычными символами ASCII. Байты с первым битом, равным 1, являются частью UTF-8 символа.

Первый байт в каждом символе UTF-8 имеет свой второй бит набора - 1, так что байт имеет самые старшие биты 11 . Каждый следующий байт, принадлежащий одному и тому же символу UTF-8, начинается с 10 .

Первый байт каждого символа UTF-8 дополнительно указывает, сколько из следующих байтов принадлежит символу, в зависимости от количества битов, которые набор для 1 в наиболее старших битах этого байта.

Дополнительные сведения см. на странице Википедии для получения UTF-8.

-121--3338923-

В общем случае происходит утечка имени сервера («stackoverflow.com»). Возможно, это произошло через DNS, прежде чем SSL/TLS мог начать подключение.

Произошла утечка сертификата сервера. Любой отправленный сертификат клиента (не является общей конфигурацией) может быть отправлен в состоянии очистки. Активный злоумышленник (man-in-the-middle), вероятно, может просто попросить ваш браузер и получить его в любом случае.

Путь к URL-адресу («/questions/2146863/how-hear-data-is-leaked-from-ssl-connection ») НЕ должен просачиваться. Он передается в зашифрованном и безопасном виде (при условии, что клиент и сервер настроены правильно и вы не нажали на ошибку сертификата).

Другой плакат правильный, что есть возможные атаки анализа трафика, которые могут быть в состоянии вывести некоторые вещи о статическом содержимом. Если сайт очень большой и динамичный (скажем stackoverflow.com) я подозреваю, что это может быть довольно трудно получить много полезной информации из него. Однако, если есть только несколько файлов с отличительными размерами, какие загрузки могут быть очевидны.

Данные POST формы НЕ должны просачиваться. Хотя обычные предостережения применяются, если вы передаете объекты известных размеров.

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

Это «утечка» информации, но, вероятно, не является большой проблемой для большинства сайтов.

-121--4859619-

Да, я играл с этим последние полчаса, и это определенно ошибка. Я пробовал добавлять StartFixture ко всем классам, а также иметь различные комбинации. Я также пробовал статические методы и методы экземпляров. Просто кажется, что он не хочет играть красиво!: - (

В любом случае, лучшее решение, которое я мог бы найти, это поместить код По крайней мере, тогда вы можете быть уверены в наследстве и это более ясно для других читателей вашего кода, которые, возможно, не знают внутренние работы NUnit: -)

0
ответ дан 3 December 2019 в 12:05
поделиться

С чем вы запускаете свои тесты? Поведение, с которым вы сталкиваетесь, не связано с NUnit (фреймворком), а скорее с используемой вами программой запуска. Используете ли вы интегрированный в Resharper тестраннер?

.
0
ответ дан 3 December 2019 в 12:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: