Как протестировать пользовательский интерфейс WPF?

Использование форм win с MVC/MVP, я бы обычно использовал класс для обертывания представления для тестирования пользовательского интерфейса, используя макеты для модели и контроллера. /ведущий. Класс-оболочка сделал бы большую часть всего в пользовательском интерфейсе наблюдаемым свойством для исполнителя тестов через свойства и события.

Будет ли это жизнеспособным подходом к тестированию приложения WPF? Есть ли способ лучше? Есть ли какие-то ошибки, на которые стоит обратить внимание?


person Matt David    schedule 12.09.2008    source источник


Ответы (9)


Что касается самого тестирования, вам, вероятно, лучше всего использовать структуру Автоматизация пользовательского интерфейса. Или, если вам нужен более свободный и независимый от wpf/winforms/win32/swt способ использования фреймворка, вы можете загрузить White от Codeplex (при условии, что вы можете использовать открытый исходный код в своей среде).

Для ошибок; Если вы пытаетесь протестировать свои представления, вы, вероятно, столкнетесь с некоторыми проблемами с потоками. Например, если вы используете NUnit, тестовый раннер по умолчанию будет работать в MTA (многопотоковое приложение), а WPF должен работать как STA (однопоточное приложение). Майк Два очень легко начал работу по модульному тестированию WPF, но без учета проблемы с потоками. У Джоша Смита есть мысли по поводу многопоточности в этом сообщении, а также указывает на эта статья Криса Хедгейта. Крис использует модифицированную версию CrossThreadTestRunner Питера Провоста. чтобы обернуть вопросы MTA/STA немного более дружественным образом.

person Kjetil Klaussen    schedule 23.09.2008
comment
re CTTR: NUnit 2.5 имеет STATThreadAttribute Также обязательно оцените TestAutomationFX - это действительно приятно (не аффилировано, просто клиент). Также посмотрел на White - но, похоже, у него не было истории записи на том же стадионе. - person Ruben Bartelink; 30.01.2009
comment
А, только что увидел stackoverflow.com/questions/58340/, LOL! - person Ruben Bartelink; 30.01.2009
comment
А вот и драконы :) Love White.. 2+ года на реальных проектах. У Уайта, однако, есть проблемы с шаблонами WPF (композиция пользовательского интерфейса. Например, узел дерева, состоящий из 2 изображений, кнопки расширения, 2 текстовых полей. Чем больше фантазии вы получите, тем более жаркое время вы проведете в автоматизации. В некоторых случаях пользовательский интерфейс Дерево не показывает элементы, которые вы можете видеть на экране. Однако WPF Snoop будет. Наконец, виртуализация и большие списки кусаются. Например, если у вас есть огромное дерево или сетка с кучей записей, найти вложенный узел/запись довольно сложно. упражнение. - person Gishu; 08.08.2012
comment
Для справки, тесты UIAutomation записи/воспроизведения не являются модульными/компонентными тестами. UIAutomation хрупкая, медленная и невероятно дорогая. - person Luke Bayes; 08.01.2019
comment
@LukeBayes Да, конечно - полностью согласен. Обновлен ответ (модульное тестирование ваших представлений => проверка ваших представлений) - person Kjetil Klaussen; 10.01.2019

@Мэтт Дэвид,

Прочтите документацию и взгляните на примеры кода для Microsoft CompositeWPF (он же Prism). Это проект, созданный специально для того, чтобы научить работать с архитектурой MVP/MVC на основе тестирования. Их пример приложения содержит модульные тесты для докладчиков\контроллеров и очень классные приемочные тесты для пользовательского интерфейса (они используют белую структуру для имитировать действия пользователя)

person aku    schedule 12.09.2008
comment
Прежде чем вы начнете использовать White, вы должны знать, что он не работает так хорошо (если вообще работает) на x64. - person Ade Miller; 02.09.2009
comment
@AdeMiller - в прошлый раз, когда я смотрел, это не поддерживалось. Однако это работает, если вы используете 32-битный тестовый запуск на машине x64 ИЛИ вы можете внести некоторые предлагаемые исправления в исходный код (поиск на белых дискуссионных форумах) и перекомпилировать. Но перед всем этим проверьте, включены ли эти исправления в последнюю версию. - person Gishu; 08.02.2012

Обновление 2016 г.: Используйте бесплатную платформу TestStack.White для автоматизации тестирования пользовательского интерфейса WPF

  • Проект White был заброшен, но его преемник TestStack.White доступен через пакет NuGet.
  • В TestStack.White есть служебные методы для запуска приложений WPF. , поиск окна/элементы управления пользователя, нажатие кнопок/элементов, имитирующее события мыши и клавиатуры, ожидание и т. д.
  • Пример, который запускает приложение WPF, нажимает кнопку и проверяет результат, выглядит следующим образом:

    using TestStack.White;
    using TestStack.White.UIItems;
    using TestStack.White.Factory;
    
    [TestMethod]
    public void TestDoSomething()
    {
        //Opens the app
        var app = Application.Launch("MyApp.exe");
    
        //Finds the main window (this and above line should be in [TestInitialize])
        var window = app.GetWindow("My App Window Title", InitializeOption.NoCache);
    
        //Finds the button (see other Get...() methods for options)
        var btnMyButton = window.Get<Button>("btnMyButtonWPFname");
    
        //Simulate clicking
        btnMyButton.Click();
    
        //Gets the result text box 
        //Note: TextBox/Button is in TestStack.White.UIItems namespace
        var txtMyTextBox = window.Get<TextBox>("txtMyTextBox");
    
        //Check for the result
        Assert.IsTrue(txtMyTextBox.Text == "my expected result");
    
        //Close the main window and the app (preferably in [TestCleanup])
        app.Close();
    }
    
person Justas    schedule 26.10.2016
comment
родом из 2019 года, TestStack.White не кажется таким активным, поскольку последний коммит был сделан в 2017 году github.com/TestStack/ Белый. - person Steffen Winkler; 24.09.2019
comment
Привет из 2020 года -- TestStack/White действительно устарел, но теперь у него есть преемник под названием FlaUI, который вы можете получить здесь: github .com/FlaUI/FlaUI - person Deadpikle; 22.01.2020

Вручную. Я не большой поклонник автоматизированного тестирования пользовательского интерфейса, если вы к этому стремитесь. Я не уверен в руководствах WPF (нужно прочитать ссылки aku).. потому что они все еще, так сказать, затвердевают... WPF не стабилизировался с точки зрения «как правильно». Если вы не используете одну из этих развивающихся платформ. усилие

  • Безжалостно протестируйте (предпочтительно автоматизированную TDD) логику/презентаторы/контроллеры. Я не призываю к небрежности или апатии.
  • Держите пользовательский интерфейс тонкой и привлеките несколько неприятных тестировщиков, чтобы они (вручную) взломали его с помощью исследовательского тестирования — нет ничего лучше, чем «тестировщик из ада», когда дело доходит до пользовательских интерфейсов. Соотношение усилий и выгоды от автоматизации такого рода тестирования огромно, оно не улавливает все и не имеет смысла... разве что для того, чтобы успокоить начальство: «Смотрите, господин! Без рук! самотестирующиеся интерфейсы!»

PS: вы можете посмотреть это (Google Talk Мэри Поппендик о бережливом производстве). что автоматизировать при тестировании

person Gishu    schedule 12.09.2008
comment
Ручное тестирование не полностью заменяет автоматическое (или наоборот). Цель автоматизированного тестирования не в том, чтобы найти ошибки, а в том, чтобы убедиться, что новые изменения не нарушают уже проверенные старые функции. - person ima; 12.09.2008
comment
Кажется, я пропустил важное слово :) в первом пункте. - person Gishu; 12.09.2008
comment
Вы забыли регрессионные тесты - для ручного тестировщика настоящая боль - прогонять сотни форм только для того, чтобы проверить некоторые основные вещи, которые можно было бы легче сделать автоматически. Лучше избавьте тестировщика от этой утомительной работы, чтобы он мог сосредоточиться на неприятном тестировании. - person Sam; 22.10.2008
comment
Мне не нравятся циклы регрессионных тестов пользовательского интерфейса. Это крошечные, легко чинимые вещи, которые не так часто ломаются, например. порядок табуляции неправильный. вручную один раз тщательно протестируйте пользовательский интерфейс и оставьте его в покое. не сломается, если кто-то не войдет и не изменит пользовательский интерфейс. что такое базовые вещи, которые можно автоматизировать - person Gishu; 22.10.2008
comment
Сосредоточьтесь на/максимизируйте тесты, которые работают только в графическом интерфейсе. Автоматизированное тестирование пользовательского интерфейса требует больших усилий для создания/стабилизации и медленного выполнения; Минимизируйте количество тестов, которые проходят через пользовательский интерфейс - person Gishu; 26.10.2011

Поскольку срок действия платформы закодированного пользовательского интерфейса истекает после версии Visual Studio 2019 (Устаревший закодированный пользовательский интерфейс), Microsoft рекомендует Appium с WinAppDriver для тестирования приложений Windows (Desktop и UWP). Вы можете использовать Appium (с WinAppDriver) или WinAppDriver напрямую для запуска тестов (WinAppDriver с или без Appium).

Напрямую WinAppDriver

Вот краткое описание работы непосредственно с WinAppDriver:

  • скачать и установить WinAppDriver:

    Выпуск WinAppDriver

  • включить режим разработчика в настройках Windows

  • запустите WinAppDriver:

    C:\Program Files (x86)\Драйвер приложения Windows\WinAppDriver.exe

  • создать новый проект модульного тестирования Visual Studio 2019 (.NET Framework)

  • добавьте пакет NuGet: Appium.WebDriver Microsoft.WinAppDriver.Appium.WebDriver (комментарий от Microsoft: рекомендуется использовать пакет NuGet WinAppDriver, чтобы в полной мере воспользоваться преимуществами расширенного ввода с API действий. )

  • добавьте новый класс DesktopSession:

    public class DesktopSession
    {
        protected const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723";
        private const string NotepadAppId = @"C:\Windows\System32\notepad.exe";
    
        protected static WindowsDriver<WindowsElement> session;
        protected static WindowsElement editBox;
    
        public static void Setup(TestContext context)
        {
            // Launch a new instance of Notepad application
            if (session == null)
            {
                // Create a new session to launch Notepad application
                var appCapabilities = new DesiredCapabilities();
                appCapabilities.SetCapability("app", NotepadAppId);
                appCapabilities.SetCapability("platformName", "Windows");
                appCapabilities.SetCapability("deviceName ", "WindowsPC");
                session = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appCapabilities);
                Assert.IsNotNull(session);
                Assert.IsNotNull(session.SessionId);
    
                // Set implicit timeout to 1.5 seconds to make element search to retry every 500 ms for at most three times
                session.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(1.5);
    
                // Keep track of the edit box to be used throughout the session
                editBox = session.FindElementByClassName("Edit");
                Assert.IsNotNull(editBox);
            }
        }
    
        public static void TearDown()
        {
            // Close the application and delete the session
            if (session != null)
            {
                session.Close();
    
                try
                {
                    // Dismiss Save dialog if it is blocking the exit
                    session.FindElementByName("Nicht speichern").Click();
                }
                catch { }
    
                session.Quit();
                session = null;
            }
        }
    
        [TestInitialize]
        public void TestInitialize()
        {
            // Select all text and delete to clear the edit box
            editBox.SendKeys(Keys.Control + "a" + Keys.Control);
            editBox.SendKeys(Keys.Delete);
            Assert.AreEqual(string.Empty, editBox.Text);
        }
    } 
  • Измените код из класса UnitTest1
        [TestClass]
        public class UnitTest1 : DesktopSession
        {
            [TestMethod]
            public void EditorEnterText()
            {
                Thread.Sleep(TimeSpan.FromSeconds(2));
                editBox.SendKeys("abcdeABCDE 12345");
                Assert.AreEqual(@"abcdeABCDE 12345", editBox.Text);
            }
    
            [ClassInitialize]
            public static void ClassInitialize(TestContext context)
            {
                Setup(context);
            }
    
            [ClassCleanup]
            public static void ClassCleanup()
            {
                TearDown();
            }
        }
  • запусти свой тест

(пример кода в основном скопирован из WinAppDriver .NotepadTest).

Appium с WinAppDriver

Если вы хотите запускать тесты с помощью Appium, на вашем компьютере должна быть установлена ​​правильная версия WinAppDriver. Установщик Appium также должен установить WinAppDriver правильной версии на вашем компьютере (пожалуйста, установите Appium для всех пользователей). В моем случае, к сожалению, это не сработало. Итак, я смотрю в файле:

C:\Program Files\Appium\resources\app\node_modules\appium\node_modules\appium-windows-driver\lib\installer.js

Здесь вы найдете правильную версию и путь загрузки:

const WAD_VER = "1.1";
const WAD_DL = `https://github.com/Microsoft/WinAppDriver/releases/download/v${WAD_VER}/WindowsApplicationDriver.msi`;

Если вы установили правильный WinAppDriver, вы можете запустить Appium.

Важно: вы должны изменить ApplicationDriverUrl

protected const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723/wd/hub";

Инструменты:

выпуски WindowsAppDriver и UI REcorder или загрузить репозиторий WinAppDriver и создайте WinAppDriverUIRecorder.sln в подкаталоге tools\UIRecorder

Знакомство с WinAppDriver UI Recorder

  • inspect.exe: требуется Windows SDK (смотрите в C:\Program Files (x86)\Windows Kits\10\bin)

Другие ссылки: Часто задаваемые вопросы по WinAppDriver Appium

person HHenn    schedule 18.07.2019
comment
У меня есть приложение WPF с элементами управления DevExpress, такими как Grid. Будет ли Appium полезен в этом? Какие стратегии вы предлагаете, поскольку у меня нет опыта работы с фреймворками для тестирования пользовательского интерфейса. - person Apoorv; 08.11.2019

Вопрос по-прежнему актуален, но многие ответы устарели. @deadpikle предложил очень хорошее решение в comment, я попробовал это, и я хочу сделать это как ответ в чтобы его увидело больше людей.

Итак, вот библиотека https://github.com/FlaUI/FlaUI. Вот краткое руководство для приложения WPF:

  1. Установите FlaUI.UIA3 из nuget

  2. Напишите это, чтобы проверить, правильно ли работает приложение (но вставьте свои строковые литералы):

    using FlaUI.Core;
    using FlaUI.Core.AutomationElements;
    using FlaUI.UIA3;
    using FluentAssertions;
    using System;
    using Xunit;
    
    namespace Functional
    {
        public sealed class General : IDisposable
        {
            private readonly Application _app = Application.Launch(@"..\App.exe");
    
            [Fact]
            public void AppStarts()
            {
                using var automation = new UIA3Automation();
                Window window = _app.GetMainWindow(automation, TimeSpan.FromSeconds(3));
    
                window.Should().NotBeNull("null means the window failed to load");
    
                window.Title.Should().Be("App title",
                    "otherwise, it could be message box with error in case of the wrong configuration");
            }
    
            public void Dispose()
            {
                _app.Close();
                _app.Dispose();
            }
        }
    }
    

Этот код также хорошо работает в конвейере GitHub Actions.

person Lev    schedule 06.08.2020

Обязательно загляните на TestAutomationFX.com. Можно потратить (хорошо, я сделал) много времени, пытаясь зафиксировать / записать события с белыми. (В начале моего поиска я проигнорировал пост или два в других местах, ссылающихся на него).

Я, конечно, присоединяюсь к другим пунктам о том, что лучший тип тестирования — это не тестирование пользовательского интерфейса.

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

person Ruben Bartelink    schedule 04.12.2008

Попробуйте Ranorex V2.0 для автоматизации WPF. С RanoreXPath и репозиторием Ranorex код автоматизации тестирования может быть полностью отделен от идентификационной информации. Ranorex также предоставляет редактор захвата/воспроизведения на основе объектов RanoreXPath.

person Community    schedule 09.12.2008

Я бы также рекомендовал TestAutomationFX для простой автоматизации тестирования пользовательского интерфейса. TestAutomationFX также позволяет вам работать с инструментами netAdvantage для wpf, которые не работают с белым и QTP. TestAutomationFX имеет простой в использовании интерфейс, интегрируется с Visual Studio и имеет хороший рекордер для записи пользовательских событий.

person Gokul    schedule 15.07.2010