Совет по модульному тестированию приложения Windows Forms

Я написал приложение Windows Forms и теперь хочу написать для него несколько модульных тестов (не совсем разработка, основанная на тестах, поскольку я пишу тесты после того, как разработал, но лучше поздно, чем никогда!) Мой вопрос в том, что с таким приложением, как вы подойдете к написанию модульных тестов, учитывая, что почти все методы и события являются частными? Я слышал о NUnit Forms, но слышал о нем как хорошие, так и плохие вещи, также были какое-то время в этом проекте нет реальной разработки, поэтому он выглядит заброшенным.Также общепринято, что у проекта есть адекватное модульное тестирование, если я написал модульные тестовые примеры для всех событий, которые пользователь запускал бы, щелкая / нажимая кнопки , или я бы х можете пойти и написать примеры модульных тестов для всех методов и найти способ проверить мои частные методы?

РЕДАКТИРОВАТЬ: Моя бизнес-логика отделена от моей логики представления, есть 1 или 2 общедоступных метода, моя бизнес-логика предоставляет доступ, чтобы форма могла получить к ним доступ, но как насчет всех частных методов, которые есть в бизнес-логике?

25
задан DukeOfMarmalade 1 February 2012 в 14:20
поделиться

2 ответа

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

Шаблоны проектирования, такие как Model View Presenter и Model View Controller , могут помочь при проектировании такой системы.

Чтобы привести пример:

public partial class Form1 : Form, IMyView
{
    MyPresenter Presenter;
    public Form1()
    {
        InitializeComponent();
        Presenter = new MyPresenter(this);
    }

    public string SomeData
    {
        get
        {
            throw new NotImplementedException();
        }
        set
        {
            MyTextBox.Text = value;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Presenter.ChangeData();
    }
}

public interface IMyView
{
    string SomeData { get; set; }
}

public class MyPresenter
{
    private IMyView View { get; set; }
    public MyPresenter(IMyView view)
    {
        View = view;
        View.SomeData = "test string";
    }

    public void ChangeData()
    {
        View.SomeData = "Some changed data";
    }
}

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

Если вы хотите выполнить модульное тестирование, вы можете использовать инструмент Mocking, например Rhino Mocks , чтобы смоделировать интерфейс View и передать его докладчику.

[TestMethod]
public void TestChangeData()
{
    IMyView view = MockRepository.DynamickMock<IMyView>();
    view.Stub(v => v.SomeData).PropertyBehavior();

    MyPresenter presenter = new MyPresenter(view);

    presenter.ChangeData();

    Assert.AreEqual("Some changed data", view.SomeData);
}
30
ответ дан 28 November 2019 в 18:26
поделиться

У вас есть несколько вариантов.

  1. Используйте инструмент, такой как Coded UI, для тестирования через пользовательский интерфейс. Это не лучший вариант, потому что он медленнее, чем модульное тестирование, и тесты, как правило, более хрупкие.

  2. Отделите свою бизнес-логику от логики представления. Если у вас есть много частных методов, выполняющих бизнес-логику в вашем пользовательском интерфейсе, вы тесно связали свою бизнес-логику с вашей презентацией. Начните определять их и перемещать в отдельные классы с открытыми интерфейсами, которые вы можете протестировать. Ознакомьтесь с принципами SOLID , которые помогут вам сохранить свободный код и возможность тестирования.

5
ответ дан 28 November 2019 в 18:26
поделиться
Другие вопросы по тегам:

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