From 9185ebec34b8bd23cf5a0ee1702c8b9948e39c0d Mon Sep 17 00:00:00 2001 From: Matt Cooley Date: Fri, 29 Jul 2022 07:59:28 -0700 Subject: [PATCH] Move UI tests to Windows 11 (#1866) Calculator's UI tests currently run on Server 2022 VM images. However, the production app is primarily developed for Windows 11. This change moves the UI test jobs to run on Windows 11, so we can run our tests in an environment that's closer to what real users will experience. --- build/pipelines/azure-pipelines.release.yaml | 10 +++ build/pipelines/templates/run-ui-tests.yaml | 23 ++++-- build/scripts/TurnOffAnimationEffects.ps1 | 22 ++++++ src/Calculator/Package.appxmanifest | 2 +- .../CalculatorUITestFramework.csproj | 2 +- .../ProgrammerOperatorsPanel.cs | 6 +- .../StandardAoTCalculatorPage.cs | 77 ++++--------------- .../UnitConverterPage.cs | 2 - .../CalculatorUITests.csproj | 2 +- .../StandardModeFunctionalTests.cs | 48 +++++------- 10 files changed, 89 insertions(+), 105 deletions(-) create mode 100644 build/scripts/TurnOffAnimationEffects.ps1 diff --git a/build/pipelines/azure-pipelines.release.yaml b/build/pipelines/azure-pipelines.release.yaml index 2fc9b674..dd1104df 100644 --- a/build/pipelines/azure-pipelines.release.yaml +++ b/build/pipelines/azure-pipelines.release.yaml @@ -36,6 +36,16 @@ jobs: useReleaseAppxmanifest: true condition: not(eq(variables['Build.Reason'], 'PullRequest')) +- template: ./templates/run-ui-tests.yaml + parameters: + platform: x64 + runsettingsFileName: CalculatorUITests.release.runsettings + +- template: ./templates/run-ui-tests.yaml + parameters: + platform: x86 + runsettingsFileName: CalculatorUITests.release.runsettings + - template: ./templates/run-unit-tests.yaml parameters: platform: x64 diff --git a/build/pipelines/templates/run-ui-tests.yaml b/build/pipelines/templates/run-ui-tests.yaml index 4fb27fe6..960fb134 100644 --- a/build/pipelines/templates/run-ui-tests.yaml +++ b/build/pipelines/templates/run-ui-tests.yaml @@ -12,17 +12,26 @@ jobs: condition: succeeded() pool: ${{ if eq(parameters.isOSSBuild, true) }}: - name: EssentialExperiencesOpenSource-windows-2022 + name: EssentialExperiencesOpenSource-Win11 ${{ if eq(parameters.isOSSBuild, false) }}: - name: EssentialExperiences-windows-2022 + name: EssentialExperiences-Win11 variables: skipComponentGovernanceDetection: true steps: - - checkout: none + - checkout: self + fetchDepth: 1 - - powershell: Set-DisplayResolution -Width 1920 -Height 1080 -Force - displayName: Set resolution to 1920x1080 - continueOnError: true + - task: PowerShell@2 + displayName: Turn off animation effects + inputs: + filePath: $(Build.SourcesDirectory)\build\scripts\TurnOffAnimationEffects.ps1 + + - task: ScreenResolutionUtility@1 + displayName: Set resolution to 1920x1080 + inputs: + displaySettings: 'specific' + width: 1920 + height: 1080 - task: DownloadBuildArtifacts@0 displayName: Download MsixBundle and CalculatorUITests @@ -52,4 +61,4 @@ jobs: platform: ${{ parameters.platform }} configuration: Release ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: - testFiltercriteria: Priority=0 + testFiltercriteria: Priority=0 diff --git a/build/scripts/TurnOffAnimationEffects.ps1 b/build/scripts/TurnOffAnimationEffects.ps1 new file mode 100644 index 00000000..9cfa1e4a --- /dev/null +++ b/build/scripts/TurnOffAnimationEffects.ps1 @@ -0,0 +1,22 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +<# +.SYNOPSIS + Disables animations on the system. Equivalent to turning off the "Animation effects" setting in the Windows Settings app. +#> + +Add-Type -AssemblyName System.Runtime.WindowsRuntime +$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0] + +Function WaitForAsyncAction($WinRtTask, $ResultType) { + $asTask = $asTaskGeneric.MakeGenericMethod($ResultType) + $task = $asTask.Invoke($null, @($WinRtTask)) + $task.GetAwaiter().GetResult() +} + +[Windows.UI.ViewManagement.Core.UISettingsController,Windows.UI.ViewManagement.Core,ContentType=WindowsRuntime] | Out-Null + +$controller = WaitForAsyncAction ([Windows.UI.ViewManagement.Core.UISettingsController]::RequestDefaultAsync()) ([Windows.UI.ViewManagement.Core.UISettingsController]) + +$controller.SetAnimationsEnabled($false) diff --git a/src/Calculator/Package.appxmanifest b/src/Calculator/Package.appxmanifest index aad82ea5..515c8ee9 100644 --- a/src/Calculator/Package.appxmanifest +++ b/src/Calculator/Package.appxmanifest @@ -8,7 +8,7 @@ Assets\CalculatorStoreLogo.png - + diff --git a/src/CalculatorUITestFramework/CalculatorUITestFramework.csproj b/src/CalculatorUITestFramework/CalculatorUITestFramework.csproj index 7d86559c..0fc0236f 100644 --- a/src/CalculatorUITestFramework/CalculatorUITestFramework.csproj +++ b/src/CalculatorUITestFramework/CalculatorUITestFramework.csproj @@ -1,6 +1,6 @@ - netstandard2.0 + net6.0 diff --git a/src/CalculatorUITestFramework/ProgrammerOperatorsPanel.cs b/src/CalculatorUITestFramework/ProgrammerOperatorsPanel.cs index 60aa92ca..770756ba 100644 --- a/src/CalculatorUITestFramework/ProgrammerOperatorsPanel.cs +++ b/src/CalculatorUITestFramework/ProgrammerOperatorsPanel.cs @@ -172,17 +172,17 @@ namespace CalculatorUITestFramework else if (source.Contains("dwordButton")) { DWordButton.Click(); - WordButton.Click(); - ByteButton.Click(); + ResetWordSize(); } else if (source.Contains("wordButton")) { WordButton.Click(); - ByteButton.Click(); + ResetWordSize(); } else if (source.Contains("byteButton")) { ByteButton.Click(); + ResetWordSize(); } else { diff --git a/src/CalculatorUITestFramework/StandardAoTCalculatorPage.cs b/src/CalculatorUITestFramework/StandardAoTCalculatorPage.cs index dea1e021..9eedc312 100644 --- a/src/CalculatorUITestFramework/StandardAoTCalculatorPage.cs +++ b/src/CalculatorUITestFramework/StandardAoTCalculatorPage.cs @@ -95,40 +95,29 @@ namespace CalculatorUITestFramework return ToolTip.Text; } - ///// - ///// Checks in AoT (Keep on top) button is present - ///// - public string GetAoTPresence() + /// + /// Checks in AoT (Keep on top) button is present + /// + public bool IsKeepOnTopButtonPresent() { - bool AoTPresent; string source = this.session.PageSource; - if (source.Contains("Keep on top")) - { - AoTPresent = true; - } - else - { - AoTPresent = false; - } - return AoTPresent.ToString(); + return source.Contains("Keep on top"); } - ///// - ///// Checks Standard calculator to see if it's in AoT (Keep on top) - ///// - public string AoTModeCheck() + /// + /// Checks Standard calculator to see if it's in AoT (Keep on top) + /// + public bool IsInAlwaysOnTopMode() { - bool InAoTMode; string source = this.session.PageSource; if ((source.Contains("Keep on top")) && (source.Contains("Header"))) { - InAoTMode = false; + return false; } else { - InAoTMode = true; + return true; } - return InAoTMode.ToString(); } /// @@ -143,11 +132,11 @@ namespace CalculatorUITestFramework } /// - /// Increases the size of the window until History label for the History panel is visible + /// Increases the height of the window until invert button is visible /// private void GrowWindowToShowInvertButton(int height) { - if (height > 1000) + if (height > 700) { throw new NotFoundException("Could not find the Invert Button"); } @@ -158,45 +147,7 @@ namespace CalculatorUITestFramework WinAppDriver.Instance.CalculatorSession.Manage().Window.Size = new Size(width, height); //give window time to render new size System.Threading.Thread.Sleep(10); - GrowWindowToShowInvertButton(width + 100); - } - } - /// - /// If the Invert button is not displayed, resize the window - /// Two attempts are made, the the button is not found a "not found" exception is thrown - /// - public void ResizeAoTWindowToDiplayInvertButton() - { - Point newWindowPostion = new Point(8, 8); - WinAppDriver.Instance.CalculatorSession.Manage().Window.Position = newWindowPostion; - string source0 = this.session.PageSource; - if (source0.Contains("invertButton")) - { - return; - } - else - { - Size newWindowSize = new Size(502, 502); - WinAppDriver.Instance.CalculatorSession.Manage().Window.Size = newWindowSize; - string source1 = this.session.PageSource; - if (source1.Contains("invertButton")) - { - return; - } - else - { - Size newWindowSize2 = new Size(750, 750); - WinAppDriver.Instance.CalculatorSession.Manage().Window.Size = newWindowSize2; - } - string source2 = this.session.PageSource; - if (source2.Contains("invertButton")) - { - return; - } - else - { - throw new NotFoundException("Could not find the Invert Button"); - } + GrowWindowToShowInvertButton(height + 100); } } } diff --git a/src/CalculatorUITestFramework/UnitConverterPage.cs b/src/CalculatorUITestFramework/UnitConverterPage.cs index 2bad0b0b..821f5385 100644 --- a/src/CalculatorUITestFramework/UnitConverterPage.cs +++ b/src/CalculatorUITestFramework/UnitConverterPage.cs @@ -68,11 +68,9 @@ namespace CalculatorUITestFramework { CalculatorApp.ClickOnWindow(); UnitConverterOperators.Units1.SendKeys(OpenQA.Selenium.Keys.Home); - UnitConverterOperators.Units1.SendKeys(OpenQA.Selenium.Keys.Enter); CalculatorApp.ClickOnWindow(); UnitConverterOperators.Units2.SendKeys(OpenQA.Selenium.Keys.Home); - UnitConverterOperators.Units2.SendKeys(OpenQA.Selenium.Keys.Enter); CalculatorApp.ClickOnWindow(); } diff --git a/src/CalculatorUITests/CalculatorUITests.csproj b/src/CalculatorUITests/CalculatorUITests.csproj index 08d9a1e6..1d4416e6 100644 --- a/src/CalculatorUITests/CalculatorUITests.csproj +++ b/src/CalculatorUITests/CalculatorUITests.csproj @@ -1,6 +1,6 @@ - netcoreapp3.1 + net6.0 false diff --git a/src/CalculatorUITests/StandardModeFunctionalTests.cs b/src/CalculatorUITests/StandardModeFunctionalTests.cs index 2897194b..60370de7 100644 --- a/src/CalculatorUITests/StandardModeFunctionalTests.cs +++ b/src/CalculatorUITests/StandardModeFunctionalTests.cs @@ -181,10 +181,10 @@ namespace CalculatorUITests Assert.IsTrue(historyFlyoutItems[1].GetExpression().Equals("4 × 5=", StringComparison.InvariantCultureIgnoreCase)); //verifies History button page.HistoryPanel.ResizeWindowToDisplayHistoryLabel(); var historyItems = page.HistoryPanel.GetAllHistoryListViewItems(); - Assert.IsTrue(historyFlyoutItems[0].GetValue().Equals("3.333333333333333", StringComparison.InvariantCultureIgnoreCase)); //verifies History button - Assert.IsTrue(historyFlyoutItems[0].GetExpression().Equals("20 ÷ 6=", StringComparison.InvariantCultureIgnoreCase)); //verifies History button - Assert.IsTrue(historyFlyoutItems[1].GetValue().Equals("20", StringComparison.InvariantCultureIgnoreCase)); //verifies History button - Assert.IsTrue(historyFlyoutItems[1].GetExpression().Equals("4 × 5=", StringComparison.InvariantCultureIgnoreCase)); //verifies History button + Assert.IsTrue(historyItems[0].GetValue().Equals("3.333333333333333", StringComparison.InvariantCultureIgnoreCase)); //verifies History button + Assert.IsTrue(historyItems[0].GetExpression().Equals("20 ÷ 6=", StringComparison.InvariantCultureIgnoreCase)); //verifies History button + Assert.IsTrue(historyItems[1].GetValue().Equals("20", StringComparison.InvariantCultureIgnoreCase)); //verifies History button + Assert.IsTrue(historyItems[1].GetExpression().Equals("4 × 5=", StringComparison.InvariantCultureIgnoreCase)); //verifies History button page.HistoryPanel.ClearHistoryButton.Click(); Assert.IsNotNull(WinAppDriver.Instance.CalculatorSession.FindElementByAccessibilityId("HistoryEmpty")); //verifies the History panel's clear history button } @@ -666,7 +666,6 @@ namespace CalculatorUITests { page.StandardAoTCalculatorPage.NavigateToStandardAoTMode(); page.StandardAoTCalculatorPage.NavigateToStandardMode(); - } [TestMethod] @@ -724,26 +723,22 @@ namespace CalculatorUITests { page.NavigationMenu.ChangeCalculatorMode(CalculatorMode.ScientificCalculator); Assert.AreEqual("Scientific", CalculatorApp.GetCalculatorHeaderText()); - page.StandardAoTCalculatorPage.GetAoTPresence(); - Assert.AreEqual("False", page.StandardAoTCalculatorPage.GetAoTPresence()); + Assert.IsFalse(page.StandardAoTCalculatorPage.IsKeepOnTopButtonPresent()); CalculatorApp.EnsureCalculatorHasFocus(); page.NavigationMenu.ChangeCalculatorMode(CalculatorMode.ProgrammerCalculator); Assert.AreEqual("Programmer", CalculatorApp.GetCalculatorHeaderText()); - page.StandardAoTCalculatorPage.GetAoTPresence(); - Assert.AreEqual("False", page.StandardAoTCalculatorPage.GetAoTPresence()); + Assert.IsFalse(page.StandardAoTCalculatorPage.IsKeepOnTopButtonPresent()); CalculatorApp.EnsureCalculatorHasFocus(); page.NavigationMenu.ChangeCalculatorMode(CalculatorMode.DateCalculator); Assert.AreEqual("Date calculation", CalculatorApp.GetCalculatorHeaderText()); - page.StandardAoTCalculatorPage.GetAoTPresence(); - Assert.AreEqual("False", page.StandardAoTCalculatorPage.GetAoTPresence()); + Assert.IsFalse(page.StandardAoTCalculatorPage.IsKeepOnTopButtonPresent()); CalculatorApp.EnsureCalculatorHasFocus(); page.NavigationMenu.ChangeCalculatorMode(CalculatorMode.StandardCalculator); Assert.AreEqual("Standard", CalculatorApp.GetCalculatorHeaderText()); - page.StandardAoTCalculatorPage.GetAoTPresence(); - Assert.AreEqual("True", page.StandardAoTCalculatorPage.GetAoTPresence()); + Assert.IsTrue(page.StandardAoTCalculatorPage.IsKeepOnTopButtonPresent()); } [TestMethod] @@ -751,12 +746,11 @@ namespace CalculatorUITests public void AoT_ErrorMessage_ResultUndefined() { page.StandardAoTCalculatorPage.NavigateToStandardAoTMode(); - page.StandardAoTCalculatorPage.ResizeAoTWindowToDisplayInvertButton(); + Assert.IsTrue(page.StandardAoTCalculatorPage.IsInAlwaysOnTopMode()); + page.StandardOperators.DivideButton.Click(); page.StandardOperators.NumberPad.Num0Button.Click(); page.StandardOperators.EqualButton.Click(); - page.StandardAoTCalculatorPage.AoTModeCheck(); - Assert.AreEqual("True", page.StandardAoTCalculatorPage.AoTModeCheck()); Assert.AreEqual("Result is undefined", page.CalculatorResults.GetAoTCalculatorResultText()); } @@ -765,11 +759,11 @@ namespace CalculatorUITests public void AoT_ErrorMessage_CannotDivideByZero() { page.StandardAoTCalculatorPage.NavigateToStandardAoTMode(); + Assert.IsTrue(page.StandardAoTCalculatorPage.IsInAlwaysOnTopMode()); page.StandardAoTCalculatorPage.ResizeAoTWindowToDisplayInvertButton(); + page.StandardOperators.ClearButton.Click(); page.StandardOperators.InvertButton.Click(); - page.StandardAoTCalculatorPage.AoTModeCheck(); - Assert.AreEqual("True", page.StandardAoTCalculatorPage.AoTModeCheck()); Assert.AreEqual("Cannot divide by zero", page.CalculatorResults.GetAoTCalculatorResultText()); } @@ -778,16 +772,16 @@ namespace CalculatorUITests public void AoT_ErrorMessage_MessageRetentionUponExitingAoT() { page.StandardAoTCalculatorPage.NavigateToStandardAoTMode(); - page.StandardAoTCalculatorPage.ResizeAoTWindowToDisplayInvertButton(); - page.StandardOperators.ClearButton.Click(); - page.StandardOperators.InvertButton.Click(); - page.StandardAoTCalculatorPage.AoTModeCheck(); - Assert.AreEqual("True", page.StandardAoTCalculatorPage.AoTModeCheck()); - Assert.AreEqual("Cannot divide by zero", page.CalculatorResults.GetAoTCalculatorResultText()); + Assert.IsTrue(page.StandardAoTCalculatorPage.IsInAlwaysOnTopMode()); + + page.StandardOperators.DivideButton.Click(); + page.StandardOperators.NumberPad.Num0Button.Click(); + page.StandardOperators.EqualButton.Click(); + Assert.AreEqual("Result is undefined", page.CalculatorResults.GetAoTCalculatorResultText()); + page.StandardAoTCalculatorPage.NavigateToStandardMode(); - page.StandardAoTCalculatorPage.AoTModeCheck(); - Assert.AreEqual("False", page.StandardAoTCalculatorPage.AoTModeCheck()); - Assert.AreEqual("Cannot divide by zero", page.CalculatorResults.GetCalculatorResultText()); + Assert.IsFalse(page.StandardAoTCalculatorPage.IsInAlwaysOnTopMode()); + Assert.AreEqual("Result is undefined", page.CalculatorResults.GetCalculatorResultText()); } #endregion