Showing posts with label unit tests. Show all posts
Showing posts with label unit tests. Show all posts

Tuesday, 23 April 2013

Simple WPF app automation testing using TestStack.White

few reads before please
http://teststack.github.io/White/
http://blog.benhall.me.uk/2008/02/12/project-white-automated-ui-testing/
http://blogs.msdn.com/b/john_daddamio/archive/2008/04/04/testing-wpf-applications-with-the-white-ui-test-framework.aspx
http://www.codeproject.com/Articles/289028/White-An-UI-Automation-tool-for-windows-applicatio

To get AutomationId's use C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\Inspect.exe

Simple WPF app now

Concept of this application is simple - we will presented with a Login screen, once details are entered we will see a Welcome screen.






Mainwindow.xaml

<Window x:Class="SimpleWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Closing="Window_Closing" Closed="Window_Closed" >
    <Grid>
        <Label Content="User Name" Height="26" HorizontalAlignment="Left" Margin="30,41,0,0" Name="user" VerticalAlignment="Top" Width="88" />
        <Label Content="Password" Height="26" HorizontalAlignment="Left" Margin="30,76,0,0" Name="label1" VerticalAlignment="Top" Width="88" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="137,41,0,0" Name="userValue" VerticalAlignment="Top" Width="120" />
        <TextBox Height="23" HorizontalAlignment="Right" Margin="0,76,246,0" Name="passwordValue" VerticalAlignment="Top" Width="120" />
        <Button Content="Login" Height="23" HorizontalAlignment="Left" Margin="137,121,0,0" Name="login" VerticalAlignment="Top" Width="75" Click="login_Click" />
    </Grid>
</Window>

Mainwindow.xaml.cs




using System;
using System.Windows;
 
namespace SimpleWPF
{
    /// 
    /// Interaction logic for MainWindow.xaml
    /// 

    public partial class MainWindow : Window
    {
        Welcome wel = new Welcome();
 
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void login_Click(object sender, RoutedEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(userValue.Text))
            {
                MessageBox.Show("Please enter user name");
                return;
            }
 
            if (string.IsNullOrWhiteSpace(passwordValue.Text))
            {
                MessageBox.Show("Please enter password");
                return;
            }
 
            if (userValue.Text.Equals("suresh") && passwordValue.Text.Equals("password"))
            {
                wel.Show();
            }
        }
 
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (wel.Visibility == System.Windows.Visibility.Visible) wel.Close();
        }
 
        private void Window_Closed(object sender, EventArgs e)
        {
            Application.Current.Shutdown();
        }
    }
}



Welcome.xaml

<Window x:Class="SimpleWPF.Welcome"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Welcome" Height="300" Width="300">
    <Grid>
        <Label Content="Welcome to hell" Height="28" HorizontalAlignment="Left" Margin="53,119,0,0" Name="label1" VerticalAlignment="Top" Width="164" />
    </Grid>
</Window>

SimpleWPFShould.xaml


using System.Diagnostics;
 
using Microsoft.VisualStudio.TestTools.UnitTesting;
 
using White.Core;
using White.Core.Factory;
using White.Core.UIItems.Finders;
using White.Core.InputDevices;
 
namespace SimpleWPFTest
{
    [TestClass]
    public class SimpleWPFShould
    {
        // source exe file path.
        private const string ExeSourceFile = @"C:\\Users\\sureshM\\Documents\\Visual Studio 2010\\Projects\\MyUIAutomation\\SimpleWPF\\bin\\Debug\\SimpleWPF.exe";
        
        //Global Variable to for Application launch
        private static Application _application = default(Application);
        
        //Global variable to get the Main window of calculator from application.
        private static White.Core.UIItems.WindowItems.Window _mainWindow = null;
 
        [ClassInitialize]
        public static void Initialize(TestContext context)
        {
            //start process for the above exe file location
            var psi = new ProcessStartInfo(ExeSourceFile);
            psi.UseShellExecute = false;
 
            // launch the process through white application
            _application = White.Core.Application.AttachOrLaunch(psi);
 
            //Get the window of calculator from white application 
            _mainWindow = _application.GetWindow(SearchCriteria.ByText("MainWindow"), InitializeOption.NoCache);
        }
 
        [ClassCleanup]
        public static void Cleanup()
        {
            _application.Close();
        }
 
        [TestMethod]
        public void OpenAndCloseSuccessfully()
        {
            Assert.IsNotNull(_application);
        }
 
        [TestMethod]
        public void LoadMainWindowSuccessfully()
        {
            Assert.IsNotNull(_mainWindow);
        }
 
        [TestMethod]
        public void LoginSuccessfully()
        {
            var user = _mainWindow.Get<White.Core.UIItems.TextBox>(SearchCriteria.ByAutomationId("userValue"));
            var password = _mainWindow.Get<White.Core.UIItems.TextBox>(SearchCriteria.ByAutomationId("passwordValue"));
            var login = _mainWindow.Get<White.Core.UIItems.Button>(SearchCriteria.ByAutomationId("login"));
 
            user.Text = "suresh";
            password.Text = "password";
 
            login.Click();
 
            var welcome = _application.GetWindow(SearchCriteria.ByText("Welcome"), InitializeOption.NoCache);
            var welcomeMessage = welcome.Get<White.Core.UIItems.Label>(SearchCriteria.ByAutomationId("label1"));
 
            Assert.IsTrue(welcomeMessage.Text.Equals("Welcome to hell"));
            Assert.IsNotNull(welcome);
 
            welcome.Close();
        }
    }
}