<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>TestingSpot Blog articles</title>
    <link>https://techcommunity.microsoft.com/t5/testingspot-blog/bg-p/TestingSpotBlog</link>
    <description>TestingSpot Blog articles</description>
    <pubDate>Sun, 19 Apr 2026 12:49:23 GMT</pubDate>
    <dc:creator>TestingSpotBlog</dc:creator>
    <dc:date>2026-04-19T12:49:23Z</dc:date>
    <item>
      <title>How AI Is Transforming Performance Testing</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/how-ai-is-transforming-performance-testing/ba-p/4490686</link>
      <description>&lt;P&gt;Performance testing has always been a cornerstone of software quality engineering. Yet, in today’s world of distributed microservices, unpredictable user behaviour, and global-scale cloud environments, &lt;STRONG&gt;traditional performance testing methods are struggling to keep up&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Enter &lt;STRONG&gt;Artificial Intelligence (AI)&lt;/STRONG&gt; — not as another industry buzzword, but as a &lt;STRONG&gt;real enabler of smarter, faster, and more predictive performance testing.&lt;/STRONG&gt;&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;U&gt;Why Traditional Performance Testing Is No Longer Enough&lt;/U&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;Modern systems are &lt;STRONG&gt;complex, elastic, and constantly evolving&lt;/STRONG&gt;. Key challenges include:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Microservices-based architectures&lt;/LI&gt;
&lt;LI&gt;Cloud-native and containerized deployments&lt;/LI&gt;
&lt;LI&gt;Dynamic scaling and highly event-driven systems&lt;/LI&gt;
&lt;LI&gt;Rapidly shifting user patterns&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This complexity introduces variability in metrics and results:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Bursty traffic&lt;/STRONG&gt; and nonlinear workloads&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Frequent resource pattern shifts&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Hidden performance bottlenecks&lt;/STRONG&gt; deep within distributed components&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Traditional tools depend on &lt;STRONG&gt;fixed test scripts&lt;/STRONG&gt; and &lt;STRONG&gt;manual bottleneck identification&lt;/STRONG&gt;, which are slower, reactive, and often incomplete.&lt;/P&gt;
&lt;P&gt;When systems behave in unscripted ways, &lt;STRONG&gt;AI-driven performance testing offers adaptability and foresight.&lt;/STRONG&gt;&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;U&gt;How AI Elevates Performance Testing&lt;/U&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;AI enhances performance testing in &lt;STRONG&gt;five major dimensions&lt;/STRONG&gt;:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;1.AI-Driven Workload Modelling&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Instead of guessing load patterns, AI learns &lt;STRONG&gt;real-world user behaviours&lt;/STRONG&gt; from production data:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Detects actual peak-hour usage patterns&lt;/LI&gt;
&lt;LI&gt;Classifies user journeys dynamically&lt;/LI&gt;
&lt;LI&gt;Generates &lt;STRONG&gt;synthetic workloads&lt;/STRONG&gt; that mirror true behaviour&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Results:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;More realistic test coverage&lt;/LI&gt;
&lt;LI&gt;Better scalability predictions&lt;/LI&gt;
&lt;LI&gt;Improved reliability for production scenarios&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;Example:&lt;/EM&gt;&lt;BR /&gt;Instead of a generic “add 100 users per minute” approach, AI can simulate &lt;STRONG&gt;lunch-hour bursts&lt;/STRONG&gt; or &lt;STRONG&gt;regional traffic spikes&lt;/STRONG&gt; with precision.&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;&lt;STRONG&gt; Intelligent Anomaly Detection&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;AI systems can automatically detect performance deviations by learning what "normal" looks like.&lt;/P&gt;
&lt;P&gt;Key techniques:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Unsupervised learning&lt;/STRONG&gt; (Isolation Forest, DBSCAN)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Deep learning models&lt;/STRONG&gt; (LSTMs, Autoencoders)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Real-time correlation&lt;/STRONG&gt; with upstream metrics&lt;/LI&gt;
&lt;LI&gt;prioritized, actionable recommendations and code-fix suggestions aligned with best practices&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;Example:&lt;/EM&gt;&lt;BR /&gt;An AI model can flag a microservice’s 5% latency spike — even when it recurs every 18 minutes — long before a human would notice.&lt;/P&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;&lt;STRONG&gt; Predictive Performance Modelling&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;AI enables you to anticipate performance issues &lt;STRONG&gt;before&lt;/STRONG&gt; load tests reveal them.&lt;/P&gt;
&lt;P&gt;Capabilities:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Forecasting resource saturation points&lt;/LI&gt;
&lt;LI&gt;Estimating optimal concurrency limits&lt;/LI&gt;
&lt;LI&gt;Running “what-if” simulations with ML or reinforcement learning&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;Example:&lt;/EM&gt;&lt;BR /&gt;AI predicts system failure thresholds (e.g., CPU maxing out at 22K concurrent users) before that load is ever applied.&lt;/P&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;&lt;STRONG&gt; AI-Powered Root-Cause Analysis&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;When performance degrades, finding the “why” can be challenging. AI shortens this phase by:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Mapping cross-service dependencies&lt;/LI&gt;
&lt;LI&gt;Correlating metrics and logs automatically&lt;/LI&gt;
&lt;LI&gt;Highlighting the most probable root causes&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;Example:&lt;/EM&gt;&lt;BR /&gt;AI uncovers that a spike in &lt;EM&gt;Service D&lt;/EM&gt; was due to cache misses in &lt;EM&gt;Service B&lt;/EM&gt; — a connection buried across multiple log streams.&lt;/P&gt;
&lt;OL start="5"&gt;
&lt;LI&gt;&lt;STRONG&gt; Automated Insights and Reporting&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;With the help of &lt;STRONG&gt;Large Language Models (LLMs)&lt;/STRONG&gt; like ChatGPT or open-source equivalents:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Summarize long performance reports&lt;/LI&gt;
&lt;LI&gt;Suggest optimization strategies&lt;/LI&gt;
&lt;LI&gt;Highlight anomalies automatically within dashboards&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This enables faster, data-driven decision-making across engineering and management teams.&lt;/P&gt;
&lt;H5&gt;&lt;U&gt;&lt;STRONG&gt;The Difference Between AIOps and AI-Driven Performance Testing&lt;/STRONG&gt;&lt;/U&gt;&lt;/H5&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Aspect&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;AIOps&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;AI-Enhanced Performance Testing&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Primary Focus&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;IT operations automation&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Performance engineering&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Objective&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Detect and resolve incidents&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Predict and optimize system behaviour&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Data Sources&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Logs, infrastructure metrics&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Testing results, workload data&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Outcome&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Self-healing IT systems&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Pre-validated, performance-optimized code before release&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;EM&gt;Key takeaway:&lt;/EM&gt; &lt;STRONG&gt;AIOps acts in production; AI-driven testing acts pre-production.&lt;/STRONG&gt;&lt;/P&gt;
&lt;H5&gt;&lt;U&gt;&lt;STRONG&gt;Real Tools Adopting AI in Performance Testing&lt;/STRONG&gt;&lt;/U&gt;&lt;/H5&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Category&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Tools&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Capabilities&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Performance Testing Tools&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;JMeter, LoadRunner, Neoload, Locust (ML Plugins), k6 (AI extensions)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Intelligent test design, smart correlation, anomaly detection&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;AIOps &amp;amp; Observability Platforms&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Dynatrace (Davis AI), New Relic AI, Datadog Watchdog, Elastic ML&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Metric correlation, predictive analytics, auto-baselining&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;These tools improve&amp;nbsp;&lt;STRONG&gt;log analysis, metric correlation, predictive forecasting&lt;/STRONG&gt;, and &lt;STRONG&gt;test script generation&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;U&gt;Key Benefits of AI Integration&lt;/U&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;✅ &lt;STRONG&gt;Faster test design&lt;/STRONG&gt; — Intelligent load generation automates script creation&lt;BR /&gt;✅ &lt;STRONG&gt;Proactive analytics&lt;/STRONG&gt; — Predict failures before release&lt;BR /&gt;✅ &lt;STRONG&gt;Higher test accuracy&lt;/STRONG&gt; — Real-world traffic reconstruction&lt;BR /&gt;✅ &lt;STRONG&gt;Reduced triage effort&lt;/STRONG&gt; — Automated root-cause identification&lt;BR /&gt;✅ &lt;STRONG&gt;Great scalability&lt;/STRONG&gt; — Run leaner, smarter tests&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;U&gt;Challenges and Key Considerations&lt;/U&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;⚠ &lt;STRONG&gt;Data quality&lt;/STRONG&gt; — Poor or biased input leads to faulty AI insights&lt;BR /&gt;⚠ &lt;STRONG&gt;Overfitting&lt;/STRONG&gt; — AI assumes repetitive patterns without variability&lt;BR /&gt;⚠ &lt;STRONG&gt;Opaque models&lt;/STRONG&gt; — Black-box decisions can hinder trust&lt;BR /&gt;⚠ &lt;STRONG&gt;Skill gaps&lt;/STRONG&gt; — Teams require ML understanding&lt;BR /&gt;⚠ &lt;STRONG&gt;Compute costs&lt;/STRONG&gt; — ML training adds overhead&lt;/P&gt;
&lt;P&gt;A balanced adoption strategy mitigates these risks.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;U&gt;Practical Roadmap: Implementing AI in Performance Testing&lt;/U&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;STRONG&gt;Step 1: Capture High-Quality Data&lt;/STRONG&gt;&lt;BR /&gt;Logs, traces, metrics, and user journeys from real environments.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 2: Select a Use Case&lt;/STRONG&gt;&lt;BR /&gt;Start small — e.g., anomaly detection or predictive capacity modelling.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 3: Integrate AI-Ready Tools&lt;/STRONG&gt;&lt;BR /&gt;Adopt AI-enabled load testing and observability platforms.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 4: Create Foundational Models&lt;/STRONG&gt;&lt;BR /&gt;Use Python ML, built-in analytics, or open-source tools to generate forecasts or regressions.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 5: Automate in CI/CD&lt;/STRONG&gt;&lt;BR /&gt;Integrate AI-triggered insights into continuous testing pipelines.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step 6: Validate Continuously&lt;/STRONG&gt;&lt;BR /&gt;Always align AI predictions with real-world performance measurements.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;U&gt;Future Outlook: The Next 5–10 Years&lt;/U&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;AI will redefine performance testing as we know it:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Fully autonomous test orchestration&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Self-healing systems&lt;/STRONG&gt; that tune themselves dynamically&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Real-time feedback loops&lt;/STRONG&gt; across CI/CD pipelines&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;AI-powered capacity planning&lt;/STRONG&gt; for cloud scalability&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Performance engineers will evolve from test executors to &lt;STRONG&gt;system intelligence strategists&lt;/STRONG&gt; — interpreting, validating, and steering AI-driven insights.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;&lt;U&gt;Final Thoughts&lt;/U&gt;&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;AI is not replacing performance testing — it’s &lt;STRONG&gt;revolutionizing&lt;/STRONG&gt; it.&lt;/P&gt;
&lt;P&gt;From smarter workload generation to advanced anomaly detection and predictive modelling, AI shifts testing from &lt;STRONG&gt;reactive validation&lt;/STRONG&gt; to &lt;STRONG&gt;proactive optimization&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Organizations that embrace AI-driven performance testing today will lead in &lt;STRONG&gt;speed, stability, and scalability&lt;/STRONG&gt; tomorrow.&lt;/P&gt;</description>
      <pubDate>Wed, 04 Feb 2026 14:59:17 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/how-ai-is-transforming-performance-testing/ba-p/4490686</guid>
      <dc:creator>padma_sathuluri</dc:creator>
      <dc:date>2026-02-04T14:59:17Z</dc:date>
    </item>
    <item>
      <title>AI‑Powered Performance Test Analysis using GHCP</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/ai-powered-performance-test-analysis-using-ghcp/ba-p/4481849</link>
      <description>&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Problem Statement&lt;/U&gt;&lt;/STRONG&gt;&lt;BR /&gt;Performance testing teams often face significant challenges in comparing JMeter test results across environments or test runs.&lt;BR /&gt;Manual comparison and analysis of multiple result files is &lt;STRONG&gt;time-consuming&lt;/STRONG&gt;, &lt;STRONG&gt;error-prone&lt;/STRONG&gt;, and lacks &lt;STRONG&gt;actionable insights&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Solution&lt;/U&gt;&lt;/STRONG&gt;&lt;BR /&gt;An AI-powered solution leveraging GHCP has been developed to address the identified challenge. This solution is designed to deliver&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Seamlessly &lt;STRONG&gt;compare JMeter performance results&lt;/STRONG&gt; across environments (e.g., On-Prem vs. Azure) or test runs.&lt;/LI&gt;
&lt;LI&gt;Provide &lt;STRONG&gt;AI-driven insights&lt;/STRONG&gt; to highlight endpoints with significant performance changes.&lt;/LI&gt;
&lt;LI&gt;Deliver &lt;STRONG&gt;clear, prioritized recommendations&lt;/STRONG&gt; for faster issue resolution.&lt;/LI&gt;
&lt;LI&gt;Reduce &lt;STRONG&gt;analysis time by up to 80%&lt;/STRONG&gt;, minimizing resource utilization and enabling cost savings.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Business Outcomes&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Automated Performance Comparison: &lt;/STRONG&gt;Seamlessly compare JMeter performance test results across two environments (e.g., On-Prem vs. Azure) or between different test runs, reducing manual effort and accelerating analysis.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;AI-Driven Insights for Decision Making: &lt;/STRONG&gt;Leverage AI to identify endpoints with the most significant performance improvements or degradations.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Actionable Observations and Recommendations: &lt;/STRONG&gt;Generate clear, prioritized recommendations based on key performance trends, ensuring faster resolution of bottlenecks and improved application reliability.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Enhanced Efficiency and Cost Savings: &lt;/STRONG&gt;Minimize analysis time and resource utilization through automation, contributing to measurable effort savings and improved operational efficiency.&amp;nbsp;manual comparison of multiple JMeter result files is time-consuming and automation can reduce analysis time by up to 80%&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Pre-Requisites&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Visual Studio code with GHCP Enabled.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Usage Guidelines&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Start GitHub Copilot Chat from within Visual Studio Code.&lt;/LI&gt;
&lt;LI&gt;Attach follow files in GHCP Chat&lt;/LI&gt;
&lt;/OL&gt;
&lt;UL&gt;
&lt;LI&gt;Azure_PerfTestResults.json&lt;/LI&gt;
&lt;LI&gt;OnPrem_PerfTestResults.json&lt;/LI&gt;
&lt;LI&gt;PerfResultsAnalysis_Instructions.md&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt;&amp;nbsp; *.json files are statistics.json files generated as part of JMeter Html Reports.&lt;/P&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;Execute below UserPrompt&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;UserPrompt: “Follow the steps in&amp;nbsp;#file:PerfResultsAnalysis_Instructions.md&amp;nbsp;and compare the two JMeter result files uploaded.”&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;File Structure Validation is performed to ensure both files conform to the expected test results format.&lt;/LI&gt;
&lt;LI&gt;Upon successful validation, select the performance metric for comparison. Ex: AverageResponseTime&lt;/LI&gt;
&lt;/OL&gt;
&lt;img /&gt;
&lt;OL start="6"&gt;
&lt;LI&gt;Test results are analyzed, and Response Time Comparison between Baseline (On-Prem) and Azure is presented, including deviation and performance status. Results are also exported to a CSV file for easy reference.&lt;/LI&gt;
&lt;LI&gt;AI-Driven Performance Insights are generated to provide actionable recommendations.&lt;/LI&gt;
&lt;/OL&gt;
&lt;img /&gt;&lt;img /&gt;
&lt;OL start="8"&gt;
&lt;LI&gt;Use the prompts below to perform a more detailed analysis of your test results.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UserPrompt: “Get me the Average Response time of GetProducts API between Azure and On-Prem”&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;EM&gt;User Prompt:&amp;nbsp;“Expected SLA on Azure is 150 ms, Get me the APIs whos Average Response Time is &amp;gt; 150 ms on Azure”&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;GitHub Repository for project is available at&amp;nbsp;&lt;A class="lia-external-url" href="https://github.com/AnilKumarGolla/PerfAnalysisUsingGHCP" target="_blank"&gt;https://github.com/AnilKumarGolla/PerfAnalysisUsingGHCP&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 02 Feb 2026 15:39:48 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/ai-powered-performance-test-analysis-using-ghcp/ba-p/4481849</guid>
      <dc:creator>AnilKumarGolla</dc:creator>
      <dc:date>2026-02-02T15:39:48Z</dc:date>
    </item>
    <item>
      <title>Java Test with Visual Studio Code</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/java-test-with-visual-studio-code/ba-p/3302401</link>
      <description>&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;"&gt;By Torian Harris&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;This tutorial will guide you through how to write and test a Java program using Visual Studio Code. It will also cover how to push the program to a Repository and automatically run tests by building a pipeline.&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;The first step is to install Visual Studio Code which you can download here: &lt;A href="https://code.visualstudio.com/Download" target="_blank" rel="noopener"&gt;Download Visual Studio Code - Mac, Linux, Windows&lt;/A&gt;. If you do not have Java already installed, you can find it here: &lt;A href="https://www.java.com/en/download/" target="_blank" rel="noopener"&gt;Download Java for Windows&lt;/A&gt;&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;Once you open the application, click the Extensions icon (Ctrl + Shift + X) on the left then type in "Extension Pack of Java" and install it by clicking the install button.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;Open View &amp;gt; Command Palette (Ctrl + Shift + P) and type in "&amp;gt;Maven: Create Maven Project”, click it then click “maven-archetype-quickstart” and version “1.4." Afterward, name the group ID and artifact ID and save the project to a folder. Press Enter to proceed through the Terminal prompts then, open your newly created project.&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;Replace the code in App.Java with the following code:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;package com.example;
 
public class  App {
    public static void main(String[] args) {
      System.out.println(sum(1,2));
      System.out.println(evaluate("2+3+4"));
    }
    
    // adds two ints
    public static int sum(int a, int b) {
      int sum = a + b;
      return sum;
    }
 
    // calculates an additional expression
    public static int evaluate(String expression) {
      int sum = 0;
      for (String summand: expression.split("\\+"))
        sum += Integer.valueOf(summand);
      return sum;
    }
  }
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;Next, click Run on the App class. This will open a Terminal that will display the results of the sum and evaluate functions.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;Now that we have a working project, let us set up some tests to validate the functions. Replace the code in AppTest.Java with the following code:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;package com.example;
 
import static org.junit.Assert.assertEquals;
import org.junit.Test;
 
public class AppTest 
{
    @Test
    public void sumTest() {
        int sum = App.sum(1,2);
        assertEquals(3, sum);
    }
 
    @Test
    public void evaluateTest() {
        int sum = App.evaluate("2+3+4");
        assertEquals(9, sum);
    }
}
 
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: black;"&gt;Click the play button next to the AppTest class to run the tests. The Testing Window will open showing the progress and results of the tests.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: 'Courier New'; font-size: 10.0pt; color: navy;"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;Now, we have functioning testing for our Java program. The next thing to do is to create a repository and build our pipeline. Navigate to your existing organization at &lt;A href="https://azure.microsoft.com/en-us/services/devops/" target="_blank" rel="noopener"&gt;https://azure.microsoft.com/en-us/services/devops/&lt;/A&gt;​ or create a new organization if you don’t already have one and click New Project. On the left, click Repos to find your repo URL. Copy it, then in Visual Studio Code, open the Command Palette, type in “&amp;gt;Git: Clone” and confirm. From here paste in the URL from your repo and save it locally. Copy all files from your previous project into the new project structure. Then in the Source Control window, commit and push your changes to the server.&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;Lastly, it is time to build our pipeline. Head to the Pipelines tab in Azure DevOps and click “New Pipeline.” Select Azure Repos Git, select your repository, then “starter pipeline.” In the YAML file, change the value of “mavenPomFile:” to “’pom.xml’” and on the right side clear out the Solution name. Click “Save and Run” and confirm to start the build process. If you click on the queued Job, you will get to see the build process in action. Once that is done, head back to your pipeline and click “Tests” to see the results of your run.&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;Congratulations! You have built a Java program and a test pipeline using Visual Studio Code.&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;If you are interested in learning more about Java testing features using Visual Studio Code, check out this post:&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;"&gt;&lt;A href="https://techcommunity.microsoft.com/t5/educator-developer-blog/visual-studio-code-java-feb-2022-updates/ba-p/3177491?search-action-id=414404253120&amp;amp;search-result-uid=3177491" target="_blank" rel="noopener"&gt;Visual Studio Code +&amp;nbsp;&lt;SPAN&gt;Java&lt;/SPAN&gt;&amp;nbsp;Feb 2022 updates&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 04 May 2022 14:44:30 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/java-test-with-visual-studio-code/ba-p/3302401</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2022-05-04T14:44:30Z</dc:date>
    </item>
    <item>
      <title>What is BDD? How to use SpecFlow in Visual Studio 2022 - SpecFlow Series - Part 1</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/what-is-bdd-how-to-use-specflow-in-visual-studio-2022-specflow/ba-p/3255140</link>
      <description>&lt;P&gt;By Edwin Hernandez&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hello everyone. This time we would like to talk about BDD and SpecFlow. We have featured many types of test automation in this blog, from UI Tests for regression to Performance Testing with JMeter. We have also highlighted some models to organize your tests such as POM (Page Object Model).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In this post, we will first review from a concept standpoint, what is the BDD model and how to use it. Then we will review what Cucumber is just like a leg up into a tutorial/intro of SpecFlow for .NET.:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color="#1460AA"&gt;1. CONCEPTS&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color="#1460AA"&gt;What is BDD?&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Behavior-Driven Development (BDD) is an agile software development process that encourages collaboration among developers, quality assurance testers, and customer representatives in a software project. It encourages teams to use conversation and concrete examples to formalize a shared understanding of how the application should behave (Wikipedia).&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;What this means is that BDD tries to link business requirements with technical specifications by writing requirements in plain English through something called Domain-Specific-Language (DSL).&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;A related concept is TDD, which is a methodology in which developers first write a Test, and only then do they write the code to make the test pass. It's an iterative process in which more tests are created which then results in more code or improvement to code.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;BDD is an evolution of TDD. In BDD, behavioral specifications are written in plain English (DSL), and these specifications can be used to write test code, and the test code can be used to create app code.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;This doesn't always happen like this. As a matter of fact, on most of the projects of which I've been part, the BDD Feature is created first, then a developer writes some code to implement it, and only then is a test written to validate the Feature. This is because I've mostly worked implementing API or UI testing, which is difficult to implement without a working UI or an API Swagger (but not impossible, you can just create stubs until endpoints are available).&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Below is a sample Feature specification (also from Wikipedia). BDD practices tell us that a feature must have a Title, a Narrative, and Acceptance Criteria. You can have multiple scenarios for the same feature since you need to cover several angles:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-150px"&gt;&lt;STRONG&gt;Title&lt;/STRONG&gt;: Returns and exchanges go to inventory.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-150px"&gt;&lt;STRONG&gt;As a&lt;/STRONG&gt; store owner,&lt;BR /&gt;&lt;STRONG&gt;I want&lt;/STRONG&gt; to add items back to inventory when they are returned or exchanged,&lt;BR /&gt;&lt;STRONG&gt;so that&lt;/STRONG&gt; I can track inventory.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-150px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-150px"&gt;&lt;STRONG&gt;Scenario 1:&lt;/STRONG&gt; Items returned for a refund should be added to inventory.&lt;BR /&gt;&lt;STRONG&gt;Given&lt;/STRONG&gt; that a customer previously bought a black sweater from me&lt;BR /&gt;&lt;STRONG&gt;and&lt;/STRONG&gt; I have three black sweaters in inventory,&lt;BR /&gt;&lt;STRONG&gt;when&lt;/STRONG&gt; they return the black sweater for a refund,&lt;BR /&gt;&lt;STRONG&gt;then&lt;/STRONG&gt; I should have four black sweaters in inventory.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-150px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-150px"&gt;&lt;STRONG&gt;Scenario 2:&lt;/STRONG&gt; Exchanged items should be returned to inventory.&lt;BR /&gt;&lt;STRONG&gt;Given&lt;/STRONG&gt; that a customer previously bought a blue garment from me&lt;BR /&gt;&lt;STRONG&gt;and&lt;/STRONG&gt; I have two blue garments in inventory&lt;BR /&gt;&lt;STRONG&gt;and&lt;/STRONG&gt; three black garments in inventory,&lt;BR /&gt;&lt;STRONG&gt;when&lt;/STRONG&gt; they exchange the blue garment for a black garment,&lt;BR /&gt;&lt;STRONG&gt;then&lt;/STRONG&gt; I should have three blue garments in inventory&lt;BR /&gt;&lt;STRONG&gt;and&lt;/STRONG&gt; two black garments in inventory.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Once a Feature is written, tests can be created. Each sentence on the specification is supposed to correspond to a unit of test code. These sentences can pass arguments down to the test code too (this is mostly done with a test tool, more on this later).&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;It's important to point out that BDD does not replace TDD, it's an evolution of it. Also, BDD can have some overlap with other test design patterns/models, such as the ones we have covered in this blog like &lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/ui-automation-page-object-model-and-other-design-patterns/ba-p/992242" target="_blank" rel="noopener"&gt;Page Object Model (POM)&lt;/A&gt;, or Fluent Design Pattern. But BDD works at a slightly higher level than those design patterns, it works at the requirement specification layer of the solution. This means that you can (and maybe should) implement BDD on top of a design model like POM.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;BDD has been around for some time (at least 2008-9), but it seems to have picked up in the early 2010s. BDD is however only a methodology, some tools make it easier to implement it in a Programming IDE. We will mention two of them.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color="#1460AA"&gt;Cucumber&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;We will review what Cucumber is, only from a concept standpoint since there is already a tutorial in this blog that takes you step-by-step on how to use it. You can find it here: &lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/get-started-with-cucumber-and-azure-devops/ba-p/2094639" target="_blank" rel="noopener"&gt;Get Started with Cucumber and Azure DevOps!&lt;/A&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Having said that, Cucumber is an open-source tool created to implement BDD. It was created in Ruby and meant for Ruby testing. Nowadays it supports other languages such as Java and JavaScript. The open-source version of Cucumber is called Cucumber Open and can be found on GitHub. It seems to be supported by SmartBear who also owns a proprietary version called Cucumber Studio.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Cucumber implements Features files according to the BDD standard and uses a line-oriented design to link the sentences (lines) in the Feature file to test code. This approach is called Gherkin Language, a language used in Cucumber to define test cases (feature files).&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Please check out the &lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/get-started-with-cucumber-and-azure-devops/ba-p/2094639" target="_blank" rel="noopener"&gt;Cucumber Tutorial&lt;/A&gt; that is mentioned above for a step-by-step description on how to implement BDD with Cucumber using Eclipse for your IDE and even integrating your test solution with Azure DevOps.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color="#1460AA"&gt;SpecFlow&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;As you read this Microsoft Community blog, you may be here to learn how to implement all of this for .NET and on Microsoft's stack. Well, SpecFlow is the most popular (maybe only one?) open-source BDD framework for .NET.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;SpecFlow started as a GitHub project in 2009 when a group of developers decided to build a native .NET framework to automate Gherkin feature files. This then evolved into SpecFlow, which was funded by Tricentis in 2019.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Now, SpecFlow has great documentation. If you are interested in this technology, you should check out their &lt;A href="https://docs.specflow.org/projects/getting-started/en/latest/index.html" target="_blank" rel="noopener"&gt;Step by Step Getting Started Guide&lt;/A&gt; and their &lt;A href="https://specflow.org/community/blog/" target="_blank" rel="noopener"&gt;Blog&lt;/A&gt;.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;In this series of posts, we will provide a similar installation/use guide but try to provide added value by updating the steps for Visual Studio 2022 (official documentation still shows 2019) and by focusing a bit more on Microsoft's stack and Azure DevOps integration. We will also try to show you how to avoid the normal bumps along the way and investigate a few C# examples of usual cases where BDD is used in the .NET world.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;In the next post, we will also explore Spex, another tool that makes it easier to sync your Feature files with Azure DevOps Test Cases.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Please read ahead!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color="#1460AA"&gt;2. TUTORIAL&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;FONT color="#1460AA"&gt;Installing SpecFlow for Visual Studio 2022&lt;/FONT&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Step 1.&lt;/STRONG&gt; Installing Extension
&lt;UL&gt;
&lt;LI&gt;The setup starts by installing the SpecFlow Extension which will then install several item templates. For this, start Visual Studio 2022 without opening any project or code. Then from the top menu, go to Extensions&amp;gt;Manage Extensions, then search the Marketplace for SpecFlow for Visual Studio 2022:&lt;/LI&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN style="font-family: inherit;"&gt;Hit download and restart VS. When it comes back again, go through the dialog to install the&amp;nbsp;&lt;/SPAN&gt;extension:&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Step 2:&lt;/STRONG&gt; SpecFlow Project Template
&lt;UL&gt;
&lt;LI&gt;Create a new project. You will notice that new templates have been installed. Create a new SpecFlow Project (C#, Windows).
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Use Framework .NET 6.0, choose MSTest for Test Framework, and make sure to add the FluentAssertions Library.&lt;/LI&gt;
&lt;LI&gt;The template will create a starter SpecFlow solution that should look like this:&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-150px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;You should now have everything you need to start writing Feature files. Let's review the methodology first.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color="#1460AA"&gt;Writing Feature following the BDD guidelines&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Let's try to follow the complete BDD process, which as we said, is an evolution of TDD. We will try to now anchor it on Agile planning and later we will integrate it with Azure DevOps.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;- To simplify things, let's work with a simple Class Library project that we will use to simulate buying/selling stock.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;- For this let's assume the following user story (tracked in e.g., Azure DevOps):&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;STRONG&gt;As a &lt;/STRONG&gt;StockApp User&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;STRONG&gt;I want &lt;/STRONG&gt;to purchase a given amount of stock at the latest value&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;STRONG&gt;So that &lt;/STRONG&gt;I can increase the value of my portfolio&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;STRONG&gt;Step 1.&lt;/STRONG&gt; Let's write a SpecFlow Feature file with a single scenario to test that story:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;Please note that this example shows that you can use parameters in line, which will then be replaced by the values in the Examples table. This is a quick and smart way to implement Data-Driven Testing. Also, note that we are using the BDD keywords for &lt;STRONG&gt;Given&lt;/STRONG&gt;, &lt;STRONG&gt;When,&lt;/STRONG&gt; and &lt;STRONG&gt;Then &lt;/STRONG&gt;to organize our narrative (&lt;STRONG&gt;And&lt;/STRONG&gt; takes the value of the previous line). We are "translating" the user story into a BDD style Feature file with statements and validations to accomplish the acceptance criteria.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;STRONG&gt;Step 2.&lt;/STRONG&gt; Now comes the fun part, you can right-click each of the lines on the Feature file individually or right-click any space to scope all lines, and "Define Steps". This will create step definitions for each line.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;- This process should create arguments for your methods or every parameter you are using in your Feature file.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;- You can choose to copy the step definitions to the clipboard or create a new class (.cs) already containing them&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;If you generate steps for all lines, it should look like this:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;STRONG&gt;Step 3. &lt;/STRONG&gt;Now, following the principles of TDD, we have a test, but we don't have the code to test. Let's add a Class Library project into the solution and reference it in the test project:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;- At the Solution level, right-click then Add&amp;gt;New Project. Select a C# Class Library project, name it and make sure to use .NET 6.0:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;- It should end up looking something like this:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;- Then make sure to reference the Class Library project in the Test Project. Right-click References&amp;gt;Add New Reference, then:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;STRONG&gt;Step 4. &lt;/STRONG&gt;The next step would be to create the stubs of some empty classes, empty methods, and in general, just reorganize the arguments in the step definitions:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;- Please note the use of SpecFlow Fluent Assertions in this line:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;newPortfolio.Value.Should().BeGreaterThan(initialPortfolioValue);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;This is an assertion, even if we don't use the Assert class. If the comparison fails, it should generate an Exception and fail the test. These fluent assertions are very useful and more efficient at validating collections and objects with many properties for such cases as it is common for API Test solutions.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;- Now, the classes, methods, and properties mentioned in this test code don't exist in the Class Library project yet. If you used Visual Studio's feature that lets you create empty stubs with Non-Implemented Exceptions, then if you run your test, they will fail of course. Let's move on to the next step.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;STRONG&gt;Step 5. &lt;/STRONG&gt;Following the TDD principles, let's write some app code in the Class Library so that we have something to test:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;That's just some simple app code that fits our purpose. Make sure your solution is built, then let's move on to execute the tests.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color="#1460AA"&gt;Running SpecFlow Tests in Visual Studio&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;If you have followed this tutorial down to this point, you should be good to go and open the Test Explorer from the top menu (Test&amp;gt;Test Explorer) and let it discover all tests. It should look like this:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;- Please note that each line of Test Data (Examples) is treated as a different test. You can execute a single data set, the whole test method, even the whole test class. Feel free to Debug and run line by line if you are interested in seeing how the execution progresses.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;- If you run all the tests, they should pass successfully:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;That's it, you have your first passing SpecFlow tests. Not much data is provided, other than the fact that they passed and the duration. Now let's review how to improve the reporting capabilities.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color="#1460AA"&gt;SpecFlow Reporting Capabilities&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Reporting is a very useful capability of SpecFlow. This feature is similar to the &lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/advanced-logger-for-ui-tests-now-on-nuget-package/ba-p/2589589" target="_blank" rel="noopener"&gt;Advanced Logger for UI Tests NuGet Package&lt;/A&gt; that we described how to implement in this blog but goes a few steps forward in that it provides a dashboard for your test run.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;**Note: The way reporting was implemented before SpecFlow 3 was that Reporting was included within the SpecFlow framework and package. However, these reports have been deprecated along with the whole SpecFlow-Runner (check the announcement &lt;A href="https://specflow.org/using-specflow/the-retirement-of-specflow-runner/?_ga=2.175927210.980525243.1645498598-462512212.1645206097&amp;amp;_gl=1%2A1szkh1o%2A_ga%2ANDYyNTEyMjEyLjE2NDUyMDYwOTc.%2A_ga_BZ55XKTXC6%2AMTY0NTQ5ODU5Ny4yLjEuMTY0NTQ5OTU1Ny4w" target="_blank" rel="noopener"&gt;here&lt;/A&gt;). Those reports were also helpful and If you are interested in how these SpecFlow 2 reports used to work, check the documentation &lt;A href="https://docs.specflow.org/projects/specflow/en/latest/Tools/Reporting.html" target="_blank" rel="noopener"&gt;here&lt;/A&gt;. However, I think that the new reports are just as good, if not better.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;The new way to go, starting on SpecFlow 3, is to use SpecFlow LivingDoc. This is a separate NuGet package that you should already have installed in your solution since you are using the SpecFlow Project Template:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;SpecFlow LivingDoc can help you generate reports for Azure DevOps or locally. For now, let's review how to create a report locally:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;STRONG&gt;Step 1. &lt;/STRONG&gt;Build (and clean) your project.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;STRONG&gt;Step 2. &lt;/STRONG&gt;Execute all tests.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;A file named TestExecution.json should have been created in this location:&lt;/P&gt;
&lt;PRE class="lia-indent-padding-left-150px"&gt;&amp;lt;SolutionDirectory&amp;gt;\&amp;lt;TestProject&amp;gt;\bin\Debug\net6.0&lt;/PRE&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;STRONG&gt;Step 3. &lt;/STRONG&gt;The HTML report can only be generated through Command Line (CLI). You will need SpecFlow LivingDoc CLI, but do NOT install the one from NuGet Packages. Instead, open the Package Manager Console and execute this:&lt;/P&gt;
&lt;PRE class="lia-indent-padding-left-150px"&gt;dotnet tool install --global SpecFlow.Plus.LivingDoc.CLI&lt;/PRE&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;That should install the version that is compatible with your SDK (.NET 6.0).&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;STRONG&gt;Step 4. &lt;/STRONG&gt;From the same Package Manager Console, execute LivingDoc by providing the folder of your test project and the location of the TestExecution.json file:&lt;/P&gt;
&lt;PRE class="lia-indent-padding-left-120px"&gt;LivingDoc feature-folder C:\users\&amp;lt;yourUser&amp;gt;\source\repos\BlogDemo\BlogDemo -t C:\users\&amp;lt;yourUser&amp;gt;\source\repos\BlogDemo\BlogDemo\bin\debug\net6.0\TestExecution.json&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;That should generate an HTML file like this one:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;- I find this report very useful because it includes every data set, all step definitions, scenario, and Feature descriptions and it is easy to filter. You can run this report for full execution of all the features of your application and it should include all in a single report/dashboard.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;- Make sure to check out the Analytics tab, to find the summarization (i.e., dashboard) view:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This should be enough for a simple example that includes all the basic components of BDD and SpecFlow in Visual Studio for .NET 6.0.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This post will be the first in a SpecFlow series, please stay tuned for the next ones:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;How to integrate SpecFlow BDD Tests with Azure DevOps using LivingDoc and Spex&lt;/LI&gt;
&lt;LI&gt;How to create API Tests with SpecFlow BDD in Visual Studio&lt;/LI&gt;
&lt;LI&gt;How to create Selenium UI Tests with SpecFlow BDD in Visual Studio&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks for reading!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;References&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://www.infoq.com/news/2018/04/cucumber-bdd-ten-years/" target="_blank" rel="noopener"&gt;https://www.infoq.com/news/2018/04/cucumber-bdd-ten-years/&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://specflow.org/about/" target="_blank" rel="noopener"&gt;https://specflow.org/about/&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://specflow.org/learn/bdd/" target="_blank" rel="noopener"&gt;https://specflow.org/learn/bdd/&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://en.wikipedia.org/wiki/Behavior-driven_development" target="_blank" rel="noopener"&gt;https://en.wikipedia.org/wiki/Behavior-driven_development&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Fri, 11 Mar 2022 19:03:05 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/what-is-bdd-how-to-use-specflow-in-visual-studio-2022-specflow/ba-p/3255140</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2022-03-11T19:03:05Z</dc:date>
    </item>
    <item>
      <title>Continuous Testing with Selenium and Azure DevOps</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/continuous-testing-with-selenium-and-azure-devops/ba-p/3143366</link>
      <description>&lt;P&gt;By Travis Ray&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;There are many articles and blogs on how to use the open-source tool, Selenium, to automate testing at the UI layer. This article assumes the reader has found a plethora of materials detailing the creation of Selenium tests and may be wondering what the use of automation is if someone must manually execute it. Creating stable automated tests is most of the battle. However, the real value of automation is realized when the execution and reporting is automatic as well.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you are using Azure DevOps pipelines, the task is relatively simple to implement. The first step is to include the test project in the Git repo of the Azure DevOps project of the application being tested. In this example, I have created a separate project in the application solution:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Configure the build pipeline with a &lt;STRONG&gt;Copy Files&lt;/STRONG&gt; task to push all the artifacts of the build to the &lt;STRONG&gt;build.artifactstagingdirectory.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The next build task will be to publish the contents of the &lt;STRONG&gt;build.artifactstagingdirectory&lt;/STRONG&gt;. This will make the dll’s and dependencies of the Selenium tests available to the build agent.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The next step will be to configure the Release pipeline. The UI tests will be executed only after a successful deployment of the application code. Add a new &lt;STRONG&gt;Visual Studio Test&lt;/STRONG&gt; task.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;For the Test Files property of the &lt;STRONG&gt;VsTest task&lt;/STRONG&gt;, specify the path to the dll of the Selenium test project.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you are unsure about the path to the test binaries, you can check the log from &lt;STRONG&gt;Copy Files&lt;/STRONG&gt; task of the of the latest successful Build Pipeline. “D:\a\1\a” will be replaced by “**” in the Test files property of the &lt;STRONG&gt;VsTest Task&lt;/STRONG&gt;. This specifies the root directory of the drop.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Check the boxes titled: “Test mix contains UI tests” and “Upload test attachments”&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Save the pipeline and create a release run. The tests will now be automatically executed at the end of a successful deployment (Continuous Testing).&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The test results can be further explored by clicking on the flask icon of the Release stage.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;By default, only the aborted and failed tests are shown. Explore the passed test results by including them in the filter.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;No Filters:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you have implemented the &lt;STRONG&gt;GetScreenshot()&lt;/STRONG&gt; method of the &lt;STRONG&gt;Selenium webdriver&lt;/STRONG&gt; and &lt;STRONG&gt;AddResultFile()&lt;/STRONG&gt; method of the &lt;STRONG&gt;TestContext object&lt;/STRONG&gt; into your tests, attachments will be included in the results:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;        [TestMethod]
        public void PUL_Categories()
        {
           
            Helper.InitializeChromeDriver(out _driver, "http://&amp;lt;partsunlimited&amp;gt;.azurewebsites.net");


            PULPages pulPages = new PULPages(_driver);

            try
            {
                Assert.IsTrue(pulPages.SelectMore());
                _driver.GetScreenshot().SaveAsFile(Directory.GetCurrentDirectory() + "/SelectMore.png");
                TestContext.AddResultFile(Directory.GetCurrentDirectory() + "/SelectMore.png");
            }
            catch
            {
                _driver.GetScreenshot().SaveAsFile(Directory.GetCurrentDirectory() + "/SelectMore.png");
                TestContext.AddResultFile(Directory.GetCurrentDirectory() + "/SelectMore.png");
                Assert.Fail();
                _driver.Quit();
            }
        }&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="font-family: inherit;"&gt;Attachments* tab:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank you for reading! If you are interested in more information on this subject, we encourage you to check out or previous posts below:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/ui-automation-page-object-model-and-other-design-patterns/ba-p/992242" target="_blank" rel="noopener"&gt;UI Automation - Page Object Model and other Design Patterns&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/advanced-logger-for-ui-test-automation-using-azure-devops/ba-p/1579436" target="_self"&gt;Advanced Logger for UI Test Automation using Azure DevOps&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;References:&lt;/P&gt;
&lt;P&gt;&lt;A href="https://azuredevopslabs.com/labs/azuredevops/appinsights/" target="_blank" rel="noopener"&gt;Monitoring Application Performance with Application Insights | Azure DevOps Hands-on-Labs (azuredevopslabs.com)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 09 Feb 2022 15:36:47 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/continuous-testing-with-selenium-and-azure-devops/ba-p/3143366</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2022-02-09T15:36:47Z</dc:date>
    </item>
    <item>
      <title>Helpful SQL Tools and Tips for Test Engineers - Part 1</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/helpful-sql-tools-and-tips-for-test-engineers-part-1/ba-p/2994183</link>
      <description>&lt;P&gt;By Cayce Chismar,&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hello everyone, this time we start a new series where we will post some more of the great content from our college in Microsoft Test Team (Principal Customer Engineer)&amp;nbsp;boB 'the ToolMan' Taylor, who is an industry expert in all topics SQL. The theme of this series will be &lt;U&gt;"Helpful SQL Tools and Tips to make your life as Test Engineer"&lt;/U&gt; (or Developer, QA, etc.), really anyone who spends time working with SQL.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As some of you may know, we have featured content from boB before, such as his "&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/learning-kusto-query-language-a-tool-for-performance-test/ba-p/2308480" target="_self"&gt;Learning Justo Query Language&lt;/A&gt;" video tutorials. If you are interested in that, please don't miss our post.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Today we will review a tool he created to make the life easier for anyone who spends a lot of time working on SQL Server Management Studio (SSMS). This tool will allow you a quicker and more efficient way to connect to several SQL Servers through SSMS.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;When working on SSMS, connecting many different SQL Server instances can get repetitive, having to enter information, Server Name, credentials, etc. each time. If you know a little C# and SQL Management Objects then boB has constructed a &lt;STRONG&gt;Connect To SQL class&lt;/STRONG&gt; to help 'connect to any SQL Server instance along with any SQL Azure Database server instance’. The &lt;STRONG&gt;Connect to SQL&lt;/STRONG&gt; base class is imported and your class will be derived from this base class. This is meant to be a simpler way to connect to a database, using an UI that looks familiar rather than going through C# config files.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Let’s do a quick walk through of this tool: &amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;Connect to SQL Base&amp;nbsp; &lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;In boB's method, the user will have access to open a connection and any Connection Information needed to perform tasks. boB created a '&lt;STRONG&gt;Connect to SQL Base&lt;/STRONG&gt;' class to be added into your project that lessens inputting data repeatedly, such as Server Name and credentials. This is also useful if a person does not know the name of which database they are needing to connect to; this class will go out and search through all available databases and allow you to pick which database you would like to use. Within boB's ConnectToSQLBase class, there are two standard resources: a default icon for use by the dialog and a default banner for use by the dialog.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Let's dive into the code that connects our database and determines the correct Authentication method!&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;   Cursor current = Cursor.Current;  
   Cursor.Current = Cursors.WaitCursor;  
   // Create our connection information for use by the Results Form  
   ServerConnection sc = newServerConnection(ServerName);  
   // Create a ConnectToSQLBase object to simplify management  
   SqlConnectionInfo sci = newSqlConnectionInfo(sc, ConnectionType.Sql);  &lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;First, capture the current cursor and set wait cursor. Then create a ServerConnection object based on the ServerName in the cbServerName ComboBox.&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;   sci.Authentication = SqlConnectionInfo.AuthenticationMethod.NotSpecified;  
   switch(AuthMethod)  
    {  
        case0: // Windows Auth  
           sci.UseIntegratedSecurity = true;  
           break;  
        case1: // SQL Server Login  
           sci.UserName = txtUserName.Text;  
           sci.Password = txtPassword.Text;  
          break;  
       case2: // Active Directory Password Authentication  
          sci.Authentication = SqlConnectionInfo.AuthenticationMethod.ActiveDirectoryPassword;  
          sci.UserName = txtUserName.Text;  
          sci.Password = txtPassword.Text;  
          sci.EncryptConnection = true;  
          break;  
       case3: // Active Directory Integrated Authentication  
          sci.Authentication = SqlConnectionInfo.AuthenticationMethod.ActiveDirectoryIntegrated;  
          sci.UseIntegratedSecurity = true;  
          sci.UserName = Id.Name;  
          sci.EncryptConnection = true;  
          break;  
   }  &lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Based on the AuthMethod selected in the cbAuthentication ComboBox, modify the ServerConnectionInfo object with the appropriate information.&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;   // Use TCP connection  
   sci.ConnectionProtocol = NetworkProtocol.TcpIp;  
   // Set user requested timeout  
   sci.ConnectionTimeout = ConnectionTimeout;  
   // Finally, we can create our SqlConnection           
   SqlConnection con = newSqlConnection(sci.ConnectionString);  
   try  
   {  
        // Now, make sure we can open a connection (to ensure user has rights)  
        // if they don't have rights, it will throw an exception  
        DoWork(con, sci);  
   }  
   catch(Exception ex)  
   {  
        MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Error);  
   }  
   finally  
   {  
        Cursor.Current = current;  
        con.Close();  
   }  &lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Line 11 calls the DoWork() method, which needs to be implemented in your derived class.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;   booluseLocalServers = false;  
   DataTable dt = SmoApplication.EnumAvailableSqlServers(useLocalServers);  
   cbServer.Items.Clear();  
   cbServer.Items.Add("(local)");  
   // Work item 311  
   // Only add servers that are at the minimum version or greater  
   foreach(DataRow r indt.Rows)  
   {  
        string[] verParts = r["Version"].ToString().Split('.');  
        // Only add servers that are at the minimum version or greater  
        if(Convert.ToInt32(verParts[0]) &amp;gt;= MinimumVersion)  
        {  
             cbServer.Items.Add(r[0].ToString());  
        }  
   }  
   cbServer.Items.Add("&amp;lt;Browse for more...&amp;gt;");  &lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;"Note: you must set the minimum SQL Server version number that you want prior to the following call which fills the cbServer drop-down list. You can set this value in your constructor. It currently defaults to 12."&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;That is all, we hope this information is useful, please follow links below for the source code and original posts and let us know of any questions in the comments section below. Thanks!&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The original Archive code is on &lt;A href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fbobtaylor29708%2FSqlCommandFilters&amp;amp;data=04%7C01%7CCayce.Chismar%40microsoft.com%7C4a31843734644f476f0808d958279c62%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637637749410402463%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;amp;sdata=8gvWgEr3jynhOeIQNKX5REV%2Bjsdl2AZg6UmLUN60a8U%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;boB Taylor's GitHub&lt;/A&gt; &amp;nbsp;&lt;/P&gt;
&lt;P&gt;Other interesting resources in boB's blog::&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.sqlbobt.com%2Fconnect-to-sql-a-utility-for-c-programmers%2F&amp;amp;data=04%7C01%7CCayce.Chismar%40microsoft.com%7C4a31843734644f476f0808d958279c62%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637637749410402463%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;amp;sdata=W23VJVyB9sl2HjNUvf7KltI0C9bCTBAotvrzbp1zCqM%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;Connect To SQL… a utility for C# programmers | boB 'The ToolMan' Taylor (sqlbobt.com)&lt;/A&gt; &amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.sqlbobt.com%2Fconnect-to-sql-a-utility-for-c-programmers-part-2%2F&amp;amp;data=04%7C01%7CCayce.Chismar%40microsoft.com%7C4a31843734644f476f0808d958279c62%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637637749410412457%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;amp;sdata=RxmossRx78VTzfK33k%2BOGAVcsw1XcFqnLm%2B2pUXiswg%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;Connect To SQL… a utility for C# programmers– Part 2 | boB 'The ToolMan' Taylor (sqlbobt.com)&lt;/A&gt; &amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.sqlbobt.com%2Fsqlcommandfilters-a-tool-for-every-toolbox%2F&amp;amp;data=04%7C01%7CCayce.Chismar%40microsoft.com%7C4a31843734644f476f0808d958279c62%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637637749410412457%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;amp;sdata=kVgzwFCyxVu2YyKfLzk%2Bzw8OW95wSz7nPnpkkj%2FEl8Q%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;SqlCommandFilters–a tool for every toolbox | boB 'The ToolMan' Taylor (sqlbobt.com)&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank you all for reading, we hope this information is helpful. Please leave any questions or comments in the section below!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 22 Nov 2021 18:32:37 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/helpful-sql-tools-and-tips-for-test-engineers-part-1/ba-p/2994183</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-11-22T18:32:37Z</dc:date>
    </item>
    <item>
      <title>Advanced Logger for UI Tests - now on NuGet Package!</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/advanced-logger-for-ui-tests-now-on-nuget-package/ba-p/2589589</link>
      <description>&lt;P&gt;By &lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="130536" data-lia-user-login="Edwin Hernandez" class="lia-mention lia-mention-user"&gt;Edwin Hernandez&lt;/a&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hello everyone,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;We published on this blog some time ago a post about an Advanced Logger for UI tests. You can follow this &lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/advanced-logger-for-ui-test-automation-using-azure-devops/ba-p/1579436" target="_blank" rel="noopener"&gt;link&lt;/A&gt; if you are interested in reading that post. For an improved version of that Logger that is now on a NuGet package, please continue reading for features, how to install it and a example:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Features:&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;This logger can be added to a Selenium Test Project running on Visual Studio as a NuGet Package.&lt;/LI&gt;
&lt;LI&gt;The logger is compatible with Selenium, WinAppDriver and Xamarin iOS.&lt;/LI&gt;
&lt;LI&gt;The package makes available an AdvLogger class that can help you log messages into an integrated HTML file.&lt;/LI&gt;
&lt;LI&gt;The messages can contain screenshots (which expand on hover) and optional messages.&lt;/LI&gt;
&lt;LI&gt;Screenshots are embedded into single HTML for easier management.&lt;/LI&gt;
&lt;LI&gt;You can categorize your messages in 4 levels (info, warning, passed &amp;amp; error) and filter in/out as needed.&lt;/LI&gt;
&lt;LI&gt;The HTML log file is added to the TextContext as an attachment. This makes it part of the results file which you can see in Visual Studio and gets uploaded automatically to Azure DevOps if you are running your UI-test project from Azure DevOps.&lt;/LI&gt;
&lt;LI&gt;Adding an attachment to the TestContext was initially supported only for MSTest. Starting on version 1.0.0.9, this is now supported for NUnit.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you want to know more about setting up a Azure Pipeline that contains a Selenium UI test project, please follow the link posted above, it has some intro into this topic. We also have a upcoming article about this that will be publish in the coming weeks.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Walkthrough&lt;/H3&gt;
&lt;P&gt;Now that we have seen the features, let's do a walkthrough of how to install it and use it on a sample Selenium C# project.&lt;/P&gt;
&lt;P&gt;We are going to use a sample project that has a single test that validates that a "User is able to create a product review". The target app is a demo website of OpenCart.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The following would be our starting code:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The code has a Test Class and a single Test Method. All libraries related to Selenium and Test Libraries have already been imported into a Visual Studio MSTest Project. This project implements a Page Object Model for the design (if you want to learn more about selenium designs, please &lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/ui-automation-page-object-model-and-other-design-patterns/ba-p/992242" target="_blank" rel="noopener"&gt;check this article&lt;/A&gt;).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The files on the solution would look like this:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-align-center"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The page classes contain the actual selenium code that interacts with the browser. This model allows for these classes to be reused and helps with maintenance.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is one of the page classes:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;    public class StoreHome
    {
        public static void SearchItem(IWebDriver driver, string searchStr)
        {
            driver.FindElement(By.Name("search")).SendKeys(searchStr + Keys.Enter);
        }
 
        public static void LoadStoreHome(IWebDriver driver)
        {
            driver.Manage().Window.Maximize();
            driver.Url = "https://demo.opencart.com/";
        }
    }&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The test class is as follows:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;[TestClass]
    public class OpenCartTests
    {
        IWebDriver driver;
 
        [TestInitialize]
        public void Initialize()
        {
            driver = new ChromeDriver(@"C:\Users\edwinh\source\repos\BlogDemoNuget\BlogDemoNuget");
        }
 
        [TestMethod]
        public void OpenCart_ValidateReviewSubmision()
        {
            StoreHome.LoadStoreHome(driver);
 
            StoreHome.SearchItem(driver, "iphone");
 
            SearchResults.SortItemsBy(driver, 4);
 
            SearchResults.OpenItem(driver, 1);
 
            ItemPage.GotoReviews(driver);
 
            ItemPage.PostAReview(driver
                , "UITester", "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eget nisi a nunc varius dictum at sit amet diam. Donec posuere gravida dui vitae elementum. In efficitur sodales erat a consectetu"
                , 4);
 
            string msg = ItemPage.GetReviewMessage(driver);
 
            Assert.AreEqual("Thank you for your review. It has been submitted to the webmaster for approval.", msg);            
        }
 
        [TestCleanup]
        public void CleanUp()
        {
            driver.Quit();
        }
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You can get this whole project by cloning it from this public &lt;A href="https://github.com/edwin-hernandez-maynez/BlogDemoNuget.git" target="_blank" rel="noopener"&gt;GitHub repo here&lt;/A&gt;, which would include all the other page classes.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For now, please look at the &lt;STRONG&gt;OpenCart_ValidateReviewSubmision &lt;/STRONG&gt;Test Method&lt;STRONG&gt;, &lt;/STRONG&gt;as you can see, since this we are implementing the Page Object model, the test is relatively easy to follow.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;First load the store page &amp;gt; then search for an item &amp;gt; sort the list &amp;gt; open the first item &amp;gt; go to reviews &amp;gt; and post a review. We additionally have a validation.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The test works as it is but Selenium and MSTest do not produce any kind of report other than passed/fail.&lt;/P&gt;
&lt;P&gt;This is where the Advance Logger for UI-tests comes into play.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To add it first search for it from the NuGet Package Manager:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Install it and solve any dependency incompatibilities with your project.&lt;/P&gt;
&lt;P&gt;Now that the library is available for your project, the following changes are needed:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;1) Create a Test Context in your test class (but outside of your test method):&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;        private TestContext testContextInstance;
        public TestContext TestContext
        {
            get { return testContextInstance; }
            set { testContextInstance = value; }
        }
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;2)&amp;nbsp;Initialize the AdvLogger&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;        AdvLogger.imageSize = 400;                                  
                  //In Pixels. Default is 300
        AdvLogger.includeSnapshootsForPassAndError = true;          
                  //Only Pass and Error levels include snapshots. Default is true.
        AdvLogger.onHoverImageSizeAsPercentageOfWindow = 50;        
                  //How big you want your screenshots to expand to. Default is 100% of browser screen width.
        AdvLogger.Current.LOGLEVEL = 1;                             
                  //Logger will include only messages at specified level or above. E.g. Level=1 means no filters
                  //levels: 1=info, 2-passed, 3-warning, 4-error
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;3) Add some Log Messages in your test method and page object classes&lt;/U&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;One of the Page Object classes:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;    public class StoreHome
    {
        public static void SearchItem(IWebDriver driver, string searchStr)
        {
            driver.FindElement(By.Name("search")).SendKeys(searchStr + Keys.Enter);
            AdvLogger.Current.LogMessage("Passed", driver);
        }
 
        public static void LoadStoreHome(IWebDriver driver)
        {
            driver.Manage().Window.Maximize();
            driver.Url = "https://demo.opencart.com/";
            AdvLogger.Current.LogMessage("Passed", driver);
        }
    }
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;For a better report, you will need to add a LogMessage to each Page Object method, so that there is a sequence of screenshots or messages in your HTML report. LogMessage uses reflection to get the class and method name and uses this to build the report.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Test Method:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;        [TestMethod]
        public void OpenCart_ValidateReviewSubmision()
        {
            AdvLogger.Current.InsertDividerForNewTest();
 
            StoreHome.LoadStoreHome(driver);
 
            StoreHome.SearchItem(driver, "iphone");
 
            SearchResults.SortItemsBy(driver, 4);
 
            SearchResults.OpenItem(driver, 1);
 
            ItemPage.GotoReviews(driver);
 
            ItemPage.PostAReview(driver
                , "UITester", "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eget nisi a nunc varius dictum at sit amet diam. Donec posuere gravida dui vitae elementum. In efficitur sodales erat a consectetu"
                , 4);
 
            string msg = ItemPage.GetReviewMessage(driver);
 
            Assert.AreEqual("Thank you for your review. It has been submitted to the webmaster for approval.", msg);
            
            AdvLogger.Current.LogMessage("Info", driver, "Validation passed");
 
            AdvLogger.Current.LogMessage("Info", driver, "REACHED END OF TEST CASE");
        }&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;You need to insert a New Test Divider at the start of your test method. The other two "Info" messages are optional but I think it gives the report a nice wrap up.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;4) EndLogging to generate html&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;        [TestCleanup]
        public void CleanUp()
        {
            driver.Quit();
            var fileName = AdvLogger.Current.EndLogging(TestContext);
            System.Diagnostics.Process.Start("explorer.exe", fileName);
        }&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;EndLogging processes all the messages and screenshots into an HTML report and attaches it to the TestContext. Once it's in the TestContext it's part of the Results File in Visual Studio and it gets uploaded into Azure DevOps if you run this project as part of an Azure Pipeline.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Process.Start just opens up the report at the end of each test, this is optional.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The end result is an HTML report that would look like this:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I hope this Logger continues to help anyone that needs it. You can find these resources in the following locations:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;NuGet Package URL: &lt;A href="https://www.nuget.org/packages/AdvUITestLogger" target="_blank" rel="noopener"&gt;https://www.nuget.org/packages/AdvUITestLogger&lt;/A&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;GitHub Repository of the Project described above: &lt;A href="https://github.com/edwin-hernandez-maynez/BlogDemoNuget" target="_blank" rel="noopener"&gt;https://github.com/edwin-hernandez-maynez/BlogDemoNuget&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Please leave any questions in the comment are below. Thanks for reading!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;P.S. We added support for NUnit:&lt;/P&gt;
&lt;H3&gt;NUnit Example&lt;/H3&gt;
&lt;P&gt;Starting with &lt;A href="https://www.nuget.org/packages/AdvUITestLogger/1.0.0.9" target="_blank" rel="noopener"&gt;NuGet Package 1.0.0.9&lt;/A&gt;, the Logger supports NUnit (in addition to MSTest). The dependency on a test framework is only used when calling the&amp;nbsp;&lt;U&gt;EndLogging&lt;/U&gt; method to generate the report and attach it to the TestContext.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You can find in this branch of the repo, an example implementing NUnit and the AdvUITestLogger:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;A href="https://github.com/edwin-hernandez-maynez/BlogDemoNuget/tree/UsingNUnit" target="_blank" rel="noopener"&gt;https://github.com/edwin-hernandez-maynez/BlogDemoNuget/tree/UsingNUnit&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 21 Sep 2021 14:48:47 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/advanced-logger-for-ui-tests-now-on-nuget-package/ba-p/2589589</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-09-21T14:48:47Z</dc:date>
    </item>
    <item>
      <title>Learning Kusto Query Language - A tool for performance test engineers</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/learning-kusto-query-language-a-tool-for-performance-test/ba-p/2308480</link>
      <description>&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Video series by boB Taylor, intro by Edwin Hernandez&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Hello everyone! This time we bring you a series of video tutorials by boB Taylor, who is a member of the Microsoft's Performance &amp;amp; Quality Services Team. He recently completed this video series about Kusto Query Language, and this is a great opportunity for us to compile it into a single place for you along with some introductory information.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 18.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;What is Kusto Query Language (KQL)?&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;You may be asking yourself: What is Kusto? What is KQL? And why would this matter for a Quality and Performance Test Blog? Well, Kusto itself was the internal code name for Azure Data Explorer, and Kusto Query Language (KQL) is the primary means of interaction with it. KQL allows you to send data queries, process data, and return the results of this processing without modifying the data or metadata. Now, why would this matter for Test Engineers? Let's first define what Azure Data Explorer can do for you:&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 16.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Azure Data Explorer&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Azure Data Explorer is a service that allows you to store log and telemetry data. It can handle many data streams emitted by several entities concurrently (websites, LOB apps, CRMs, Social data sources, IoT devices, Cloud components, etc.). This data is collected and stored. Data Explorer then provides a way for you to analyze this large volume of data, perform complex queries and drill down into specific events.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Therefore, Azure Data Explorer provides a great way for you to perform diagnostics, monitoring, and reporting of all components of your application and environment. This kind of analysis is key for performance testing and application optimization.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 16.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Kusto Query Language(KQL)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;KQL is a read-only query language. The syntax is similar to SQL, but it was created specifically to work with large datasets in Azure. Since it's read-only there are no update or delete clauses. It is based on relational management systems, which use schema entities, and is organized into a hierarchy like SQL's databases tables and columns.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 16.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Other Azure Services&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;KQL is the primary mean to query data from Azure Data Explorer; however, it is also used to interact with the following inter-related Azure services:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL style="margin-left: .75in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="circle"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;FONT size="4"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Application Insights&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;FONT size="4"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Log Analytics&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;FONT size="4"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Azure Monitor, and again:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;FONT size="4"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Azure Data Explorer&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 18.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Microsoft documentation&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;If you want to learn more from the official Microsoft documentation, make sure to check out the following:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;FONT size="4"&gt;&lt;A href="https://docs.microsoft.com/en-us/azure/data-explorer/data-explorer-overview" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;What is Azure Data Explorer?&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt; Check this one to learn about the possible data sources and workflows.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;FONT size="4"&gt;&lt;A href="https://docs.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;What are Application Insights?&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt; Fundamentals, how to implement the telemetry, do analysis, etc. We hope to bring you a detailed guide on this blog in the future.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;FONT size="4"&gt;&lt;A href="https://docs.microsoft.com/en-us/azure/azure-monitor/overview" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Azure Monitor Overview&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;.&amp;nbsp;Solution for collecting, analyzing, and acting on telemetry from your cloud and on-premises environments.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;FONT size="4"&gt;&lt;A href="https://docs.microsoft.com/en-us/azure/azure-monitor/logs/log-analytics-overview" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Overview of Log Analytics. &lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;&amp;nbsp;Tool in the Azure portal used to edit and run log queries with data in Azure Monitor Logs.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;FONT size="4"&gt;&lt;A href="https://docs.microsoft.com/en-us/azure/data-explorer/kusto/concepts/" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Getting started with Kusto&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;. Check this one to learn the basics about KQL, where there is a tutorial and samples.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;FONT size="4"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;For a more hands-on kind of learning, check out this lab in Microsoft Learn: &lt;/SPAN&gt;&lt;A href="https://docs.microsoft.com/en-us/learn/modules/monitor-performance-using-azure-monitor-for-vms/" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Monitor performance of virtual machines using Azure Monitor for VMs&lt;/SPAN&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;SPAN style="font-weight: bold;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 18.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;boB Taylor's Video Series&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;If you are done leafing through the official documentation above and want a much more detailed training. boB created a series of video tutorials where he goes into detail on KQL, from the fundamentals to complex functions, passing through the most common operators:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="lia-indent-padding-left-90px" style="direction: ltr;"&gt;
&lt;TABLE class="lia-indent-margin-left-90px" style="width: 75%; direction: ltr; border-collapse: collapse; border: 1pt solid #A3A3A3;" title="" border="1" summary="" cellspacing="0" cellpadding="0"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;1&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;What is KQL and why should I care?&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/first-up-on-the-menu-an-appetizer-what-is-kql-and-why-should-i-care/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;2&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5909in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;The Editors or how do I write and execute KQL queries&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-the-editors-or-how-do-i-write-and-execute-kql-queries/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;3&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Our first KQL operators&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-our-first-kql-operators/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;4&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Wait where can I consume Kusto data?&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/wait-where-can-i-consume-kusto-data/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;5&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Summarize&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-summarize/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;6&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Project, extend, and explain&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-project-extend-and-explain/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;7&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Distinct, sample-distinct, top, and top-nested&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-distinct-sample-distinct-top-and-top-nested/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;8&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Scalar functions part 1&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-scalar-functions-part-1/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;9&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;More scalar operators!&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-more-scalar-operators/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;10&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Fun with datetime, timespan and date_part&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-fun-with-datetime-timespan-and-date_part/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;11&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Conditional logic and strings&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-conditional-logic-and-strings/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;12&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Advanced aggregation operators&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-advanced-aggregation-operators/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;13&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Let, join, and union&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-let-join-and-union/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;14&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Datatable, prev, next, row_cumsum, and materialize&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-datatable-prev-next-row_cumsum-and-materialize/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;15&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Range, make-series&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/sql-snacks-are-back-range-make-series/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;16&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Series_decompose family of functions&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-series_decompose-family-of-functions/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;17&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;The remaining time series functions&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-the-remaining-time-series-functions/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;18&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Machine Learning Plugins&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/next-on-the-menu-machine-learning-plugins/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;19&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;User Analytics Plug-ins&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/1388-2/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: .6673in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;20&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.5722in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Last on KQL -&amp;nbsp;charting&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: .9291in; padding: 4pt 4pt 4pt 4pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; text-align: center;" lang="en-US"&gt;&lt;FONT size="4"&gt;&lt;A href="http://www.sqlbobt.com/last-on-the-kusto-query-language-menu-charting/" target="_blank" rel="noopener"&gt;Link to video&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 18.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 18.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;In Conclusion…&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;If you want to monitor and diagnose the performance of your application in Azure, KQL is a key resource. It is a good skill to have in your portfolio, especially if you are involved in load testing. Please make sure to check our other article about a&amp;nbsp;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/collection-of-useful-tools-for-performance-test-engineers/ba-p/1884882" target="_blank" rel="noopener"&gt;Collection of Useful Tool for Performance Test Engineers&lt;/A&gt;, and please leave any questions in the comments section.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;FONT size="4"&gt;Thanks!&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 24 May 2021 19:06:01 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/learning-kusto-query-language-a-tool-for-performance-test/ba-p/2308480</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-05-24T19:06:01Z</dc:date>
    </item>
    <item>
      <title>Test Automation and EasyRepro: 05 - Adding EasyRepro Tests to Azure DevOps</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-05-adding-easyrepro-tests-to-azure/ba-p/2283048</link>
      <description>&lt;P&gt;&lt;SPAN&gt;The following is the fifth and final on a series of articles by&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://www.linkedin.com/in/aliyoussefi/" target="_blank" rel="noopener nofollow noreferrer"&gt;@Ali Youssefi&lt;/A&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;that we have been cross-posting into this Test Community Blog for a couple of months now. These articles were first published by Ali in the Dynamics community but since the topic related with Testing, Quality and Selenium, we though it would makes sense to publish here as well.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;If you didn't get a chance to catch the previous parts of these series, please have a look the links below:&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI class="md-end-block md-heading"&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-01-overview-and-getting-started/ba-p/1617726" target="_blank" rel="noopener"&gt;Test Automation and EasyRepro: 01 - Overview and Getting Started&lt;/A&gt;&lt;/LI&gt;
&lt;LI class="md-end-block md-heading"&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-02-designing-and-debugging-unit/ba-p/1853622" target="_blank" rel="noopener"&gt;Test Automation and EasyRepro: 02 - Designing and Debugging Unit Tests&lt;/A&gt;&lt;/LI&gt;
&lt;LI class="md-end-block md-heading"&gt;&lt;A title="Test Automation and EasyRepro: 03 - Extending the EasyRepro Framework" href="https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-03-extending-the-easyrepro/ba-p/2043985" target="_blank" rel="noopener"&gt;Test Automation and EasyRepro: 03 - Extending the EasyRepro Framework&lt;/A&gt;&lt;/LI&gt;
&lt;LI class="md-end-block md-heading"&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-04-monitoring-and-insights-with/ba-p/2117974" target="_self"&gt;Test Automation and EasyRepro: 04 - Monitoring and Insights with EasyRepro&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Otherwise, please read ahead!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Summary&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://github.com/microsoft/easyrepro" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;EasyRepro&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt; is an open source framework built upon &lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://www.seleniumhq.org/" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;Selenium&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt; allowing automated UI tests to be performed on a specific Dynamics 365 organization. This article will cover incorporating EasyRepro into a DevOps Build pipeline, allowing us to begin the journey toward automated testing and quality. We will cover the necessary settings for using the VSTest task and configuring the pipeline for continuous integration and dynamic variables. Finally we will review the test result artifacts providing detailed information about each unit test and test run.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Getting Started&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;If you haven't already, please review the previous articles showing how to create, debug and extend EasyRepro. This article assumes that the steps detailed in the first article titled &lt;A href="https://community.dynamics.com/crm/b/crminthefield/posts/test-automation-and-easyrepro-01---overview-and-getting-started" target="_blank" rel="noopener noreferrer"&gt;Cloning locally from Azure DevOps&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt; have been followed. This approach will allow our test design team to craft and share tests for quality assurance across our DevOps process.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;The Run Settings File&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The run settings file for Visual Studio unit tests allow variables to be passed in similar to the app.config file. However this file is specific to Visual Studio tests and can be used in the command line and through Azure DevOps pipelines and test plans. &lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://docs.microsoft.com/en-us/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-2019#example-runsettings-file" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;Here&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt; is a sample to create a runsettings file.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The image above shows how to implement the TestRunParameters needed for EasyRepro unit tests. You can also find an example in the &lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Microsoft.Dynamics365.UIAutomation.Sample&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt; project called easyrepro.runsettings. The runsettings file can be used to set the framework version, set paths for adapters, where the result artifacts will be stored, etc. In the Settings section below we will point to a runsettings file for use within our pipeline.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN&gt;&lt;SPAN class="md-plain"&gt;The ClassInitialize Data Attribute&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The &lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.testtools.unittesting.classinitializeattribute?view=mstest-net-1.2.0" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;ClassInitialize&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt; data attribute is used by Visual Studio unit tests to invoke the constructor of a test class. This decoration coupled with the runsettings file will allow us to pass in a &lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.testtools.unittesting.testcontext?view=mstest-net-1.2.0" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;TestContext&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt; object containing the run parameters.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Properties&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The configuration values from the runsettings file are included in the Properties object similar to the app.config file. For usage with EasyRepro we will want to leverage the .ToSecureString extension method which will help us when logging into the platform. Below is an example using this extension method.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Setting up the Build Pipeline&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;In the first article &lt;A href="https://community.dynamics.com/crm/b/crminthefield/posts/test-automation-and-easyrepro-01---overview-and-getting-started" target="_blank" rel="noopener noreferrer"&gt;Test Automation and EasyRepro: 01 - Getting Started&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;, we discussed how to clone from GitHub to a DevOps Git repository which we can then clone locally. The examples below follow this approach and assume you have cloned locally from Azure DevOps Git repo.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The first thing to setting up the Build Pipeline is to navigate to the DevOps organization and project. Once inside the project, click on the Pipelines button to create a Build Pipeline. Tasks here require resolving the NuGet package dependencies, building a solution with MS Build and running unit tests using the VS Test task as shown in the image below.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The core task is the VsTest which will run our Visual Studio unit tests and allow us to dynamically pass values from the Build pipeline variables or from files in source control. The section below goes into the VsTest task, specifically version 2.0.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Reviewing the VsTest task&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Test Files&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The test file field needs to point to a working directory, dictated by the Search folder field, to locate the compiled unit test assemblies. When using the default task this field looks for assemblies with the word &lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;&lt;SPAN class="md-plain"&gt;test&lt;/SPAN&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;. &lt;/SPAN&gt;&lt;SPAN&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;If you're starting with the Sample project from EasyRepro you will need to change this to look for the word Sample as shown above.&lt;/SPAN&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt; When this task is run you can confirm if the correct assembly is found in the log for the task.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Test Filter Criteria&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The test filter criteria field is used to help limit the scope of the unit tests run within the unit test assembly. Depending on the data attribute decorations you can restrict the unit test run task to only run specific tests. The criteria can be somewhat challenging if you haven't worked with them before so I'd suggest using the Visual Studio Command Prompt to test locally to better understand how this will work in Azure DevOps Pipelines.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The above image shows an example of using the TestCaseFilter argument to run a specific test class. This argument can be used to run specific classes, priorities, test categories, etc. For instance&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;More information on the test filter criteria can be found &lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://github.com/Microsoft/vstest-docs/blob/master/docs/filter.md" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;here&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Settings File&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The settings file field works with the vstest.console.exe utilizing the "/Settings" argument but allows the ability to pick a file from the repository directly. This field is customizable to also work with Build Pipeline variables which I'll describe next.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Override Test Run Parameters&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Overriding test run parameters is useful when we want to reuse the same test settings but pass in variables from the Build Pipeline. In the example below I'm replacing the parameters from the runsettings file on the left with Build Pipeline variables on the right.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Below are my pipeline variables I've defined. This allows me to check in a runsettings file but not have to modify parameters before committing. The values can be plain or secure strings which you will have to take into account if you plan to use one or the other. &lt;/SPAN&gt;&lt;SPAN&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;These variables can also be provided at run time when we queue the build.&lt;/SPAN&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Enabling the Continuous Integration Trigger&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Enabling the continuous integration trigger allows developers to craft their unit tests and have our build pipeline run on push of a commit. This is configured from the Triggers tab on the pipeline which will bring up the above image. To enable, check the box for 'Enable continuous integration' and set which branch you want to have this fire off on. This doesn't restrict a tester from queuing a build on demand but does help us move forward towards automation!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Running the Build Pipeline&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;To kick off the build pipeline, commit and push changes to your unit tests as you would any Git commit. Once the push is finished you can navigate to the Azure DevOps org and watch the pipeline in action. Below is a recording of a sample run.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Exploring the Results File&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The results of the unit tests can be found in the build pipeline build along with the logs and artifacts. The test results and artifacts are also found in the Test Runs section of the Azure Tests area. The retention of these results are configurable within the Azure DevOps project settings. Each build can be reviewed at a high level for various test result statuses as shown below:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The summary screen includes the unit tests ran and information about failed tests that can be used to track when a regression began. Columns shown include the last time a test ran and what build it began to fail on.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;When investigating a failed unit test a link to a new or existing bug can be added. This is useful to help track regressions and assign to the appropriate team. Bugs can be associated from the test run or specific unit test and include links to the build, test run and test plan. The exception message and stack trace are automatically added if linked from the failed unit test.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Each test run includes a test results file that can be downloaded and viewed with Visual Studio. The test artifacts can also be retained locally for archiving or reporting purposes. The contents of the test can be extracted and transformed to be used by platforms such as PowerBI or Azure Monitor.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Its key to point out that when used with a Azure Test Run these results can be retrieved via the API and reported on directly. Below is an image of the response from the Test Run.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Next Steps&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Including Unit Tests as a Continuous Delivery Quality Gate&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Building and running our EasyRepro tests with Build Pipelines represent an important first step into your journey into DevOps as well as what has been called &lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://en.wikipedia.org/wiki/Continuous_testing" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;Continuous Quality&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;. Key benefits here include immediate feedback and deep insights into high value business transactions. Including these types of tests as part of the release of a Dynamics solution into an environment is paramount to understanding impact and providing insight.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Including Code Analysis as a Continuous Delivery Quality Gate&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;One thing I'd like to point out is that UI testing can help ensure quality but this should be coupled with other types of testing such as security testing or code analysis. The PowerApps Product Group has a tremendously valuable tool called the PowerApps Project Checker for code analysis. Project Checker can help identify well documented concerns that may come up as part of our deployment. This tool can be used &lt;/SPAN&gt;&lt;SPAN class="md-link"&gt;&lt;A href="https://powerapps.microsoft.com/en-us/blog/automatically-validate-your-solutions-using-the-powerapps-checker-powershell-module/" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;via PowerShell&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt; or from the &lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/build-tools-tasks" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;PowerApps Build Tasks&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt; within the Visual Studio Marketplace. It can also be run from the PowerApps portal in a manual fashion if desired.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI class="md-end-block md-p"&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://powerapps.microsoft.com/en-us/blog/make-higher-quality-apps-with-solution-checker/" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;Make higher quality Apps with Solution checker&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class="md-end-block md-p"&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://powerapps.microsoft.com/en-us/blog/automatically-validate-your-solutions-using-the-powerapps-checker-powershell-module/" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;Automatically validate your solutions using the PowerApps checker PowerShell Module&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class="md-end-block md-p"&gt;&lt;SPAN class="md-link"&gt;&lt;SPAN class="md-link"&gt;&lt;A href="https://docs.microsoft.com/en-us/powerapps/maker/common-data-service/use-powerapps-checker#best-practice-rules-used-by-solution-checker" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;Best practice rules used by solution checker&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;This code quality step can be included as part of the extraction of modifications from your development or sandbox environments or as a pre step before packaging a managed solution for deployment. For additional detail there is a wonderful &lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://community.dynamics.com/crm/b/crminthefield/posts/modularizing-pipelines-and-implementing-powerapps-checker-in-devops-for-dynamics-365-for-customer-engagement-solutions---devops-part-2#include-powerapps-checker-in-a-pipeline" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;post by the Premier Field Engineer team&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt; documenting how to include this task into your pipelines. Special thanks to Premier Field Engineers' &lt;A href="https://www.linkedin.com/in/paulbreuler/" target="_blank" rel="noopener noreferrer"&gt;Paul Breuler&lt;/A&gt; and &lt;A href="https://www.linkedin.com/in/tyler-hogsett-9768a816/" target="_blank" rel="noopener noreferrer"&gt;Tyler Hogsett&lt;/A&gt; for documenting and detailing the journey into DevOps.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;I highly recommend incorporating this important step into any of your solution migration strategies even if you are still manually deploying solutions to better understand and track potential issues.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Scheduling Automated Tests&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p md-focus"&gt;&lt;SPAN class="md-plain md-expand"&gt;Scheduling tests can be done in various ways, from build and release pipelines to Azure Test Plans. For pipelines triggers can be used to schedule based off a predetermined schedule. Azure Test Plans allow for more flexibility to run a specific set of tests based off of test cases linked to unit tests. To find out more about setting this up, refer to &lt;/SPAN&gt;&lt;SPAN class="md-link"&gt;&lt;A href="https://docs.microsoft.com/en-us/azure/devops/test/run-automated-tests-from-test-hub?view=azure-devops" target="_blank" rel="noopener noreferrer"&gt;&lt;SPAN class="md-plain"&gt;this article&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Conclusion&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;This article covers working from a local version of EasyRepro tests and how to incorporate into a Azure DevOps Build Pipeline. It demonstrates how to configure the VsTest task, how to setup triggers for the Build Pipeline and how to review Test Results. This should be a good starting point into your journey into DevOps and look forward to hearing about it and any question you have in the comments below.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;At the Microsoft Test Team, we have followed this tutorial and often use EasyRepro for our UI-Test related needs for Dynamics 365, please stay tune for a Tips and Trick related to EasyRepro, until next time!&lt;/P&gt;</description>
      <pubDate>Mon, 26 Apr 2021 16:42:33 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-05-adding-easyrepro-tests-to-azure/ba-p/2283048</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-04-26T16:42:33Z</dc:date>
    </item>
    <item>
      <title>Simulating Targeted Throughput for Load testing with JMeter</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/simulating-targeted-throughput-for-load-testing-with-jmeter/ba-p/2227962</link>
      <description>&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;By &lt;STRONG&gt;Tejas Shinde&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;JMeter is quite a versatile tool when it comes to Load Testing. Developers can use it to simulate various usage patterns; it also has various plugins that enable it to manipulate these usage patterns.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;When we want to simulate the application load by using APIs, we think about targeted throughput. In such scenarios, typically, we want to load the system with specific throughput (requests per second) for a specified duration.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;In this post, we will take a look at some JMeter plugins that we can use for controlling throughput and ways to use these plugins more efficiently.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;We will use the following JMeter plugins for this example:&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Dummy sampler - To simulate request samplers&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;3 Basic Graphs - To monitor the active threads and transaction rate (throughput)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Custom Thread Groups - For Concurrency Thread Group&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;In the following example, we will try to simulate the load of &lt;SPAN style="font-weight: bold;"&gt;~20 req/sec. &lt;/SPAN&gt;There are various ways you can control the rate at which you can generate the requests; the most commonly used ways are either introducing think time in between the requests or using any of the throughput controllers. &lt;U&gt;The JMX solution can be found at the bottom of this article&lt;/U&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Every thread group uses the same two samplers that are under the Test Fragment "Request Samples" using the module controllers.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;For "First Sampler", response time is set to "${__Random(3000,5000)}" and for "Second Sampler" it is set to "${__Random(5000,10000)}"&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Throughout this test plan, all the thread groups are set to use 500 threads. And will be executed for ~5 minutes. Typically, the total number of threads needed to achieve a throughput can be calculated by using the following formula Throughput * Avg. Response Time / 1000. To be on the safer side, instead of Avg. Response Time, we use Maximum Response Time in the formula. However, for demo purpose, we are going to use 500 as thread count in the below examples&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;We will discuss the following cases:&lt;/P&gt;
&lt;OL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in; font-family: Calibri; font-size: 11.0pt; font-weight: normal; font-style: normal;" type="1"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;" value="1"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; font-weight: normal; font-style: normal;"&gt;Without any throughput controlling measures&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;With sleep time (Using Constant Timer)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;With Constant Throughput Timer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;With Throughput Shaping Timer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;With Concurrency Thread Group with Throughput Shaping Timer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Case 1: Without any throughput controlling measures&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;In this case, no throughput controlling is introduced. This gives us a rough idea about how much throughput we can achieve with 500 threads without having any throughput control.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Results:&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;When we run this thread group, the following are the results of the Aggregate Report:&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;In my case, JMeter was able to generate 81.2 requests/sec. (It may differ in your case based on the various factors)&lt;/P&gt;
&lt;TABLE border="1" width="100%"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="50%"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Throughout the execution, 500 threads were active and sending the requests.&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="50%"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Throughput graph looks consistently distributed&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;As we can see, without using any throughput controlling measures, 81.2 req/sec were generated using 500 threads.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Case 2: With sleep time (Using Constant Timer)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;In this case, throughput will be controlled by introducing sleep time in between threads. In this example, a Constant Timer with 15000 milliseconds is used for sleep time. You may need to try it out in a few runs to find the optimum value of sleep time to get the desired throughput.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Results:&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE border="1" width="100%"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="50%"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Throughout the execution, 500 threads were active and sending the requests.&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="50%"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;As we used sleep times, request generation happens in bursts where throughput will be balanced as a result of sleep times&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Case 3: With Constant Throughput Timer&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;In this scenario, we will use Constant Throughput Timer. This timer will also work similarly to that of Constant Timer. It will pause the threads based on periodically based on the current value of throughput to match up the target throughput value. In this case, an advantage will be sleep time will be calculated automatically based on the target value.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;SPAN style="font-style: italic;"&gt;*Note that the throughput value is in terms of req/min&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Results:&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE border="1" width="100%"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="50%"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Throughout the execution, 500 threads were active and sending the requests.&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="50%"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Throughput graph looks very much similar to the graph from the previous case, where we manually paused the threads&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Case 4: With Throughput Shaping Timer&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;In this case, we are using a JMeter plugin - Throughput Shaping timer. This plugin also works similarly to Constant Throughput Timer, which pauses the threads based on the target Throughput. However, a couple of advantages are the request bursts are more consistent in nature, and the samples lie very close to the median value, as can be seen in the throughput graph. Also, this plugin will allow us to simulate various levels of throughput values over a period of time which is not possible in the case of Constant Throughput Timer as it can target only a specific value.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Results:&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE border="1" width="100%"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="50%"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Throughout the execution, 500 threads were active and sending the requests.&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="50%"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;With Throughput Shaping Timer, the graph looks more consistent, and the sample's distribution is close to the median value of the throughput, which has been set as a target&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Case 5: With Concurrency Thread Group with Throughput Shaping Timer&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;So far, in all of the previous cases, we have used 500 threads to generate the throughput of 20 req/sec. Depending upon the total number of requests and response time of those requests, it will be quite a calculation to identify the optimum number of thread count that is needed to generate the target output. In cases where the response time is quite low, we will need much less than 500 threads to generate that throughput. And similarly, in situations where response time is high, we may need more than 500 threads to generate the desired throughput.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;To calculate the number of threads that are needed to generate the target throughput, we will use another plugin from JMeter in conjunction with Throughput Shaping Timer. Also, to generate the minimum amount of threads, we will use the Schedule Feedback function from JMeter, which will define the number of threads that should be running concurrently to generate the target throughput.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Following is the Concurrency Thread Group, which is from the "Custom Thread Groups" plugin. Target concurrency is defined using the feedback function that will work based on the feedback from Throughput Shaping Timer to provide the latest count of threads that are needed to achieve the target of the Throughput Shaping Timer.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Feedback function parameters can be explained as follows:&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;ThroughputShapingTimer - Name of the element. In this case, the name of the Throughput Shaping Timer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;5 - Number of threads at the start&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;500 - Maximum allowed threads&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;10 - Number of spare threads in the pool&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Results:&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;So as you can see, by using less than 180 threads, we were able to generate a throughput of 19.1 (It’s less than 20 as a result of throughput ramp up and ramp down steps defined in Throughput Shaping Controller).&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE border="1" width="100%"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="50%"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Maximum threads used during this run were less than 180.&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="50%"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Maximum threads used during this run were less than 180.&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Caution:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;While using the concurrency thread group with Throughput Shaping Timer, makes sure that you specify the sufficient number of threads as if the number is not high, the plugin will show a warning message in the logs stating that there are not enough threads available in the pool to generate the target throughput&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Similarly, make sure that the specified thread count is not too high as it may result in a spike in throughput at the end of the test (as seen in the above throughput graph) while JMeter is shutting all the threads&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Conclusion&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Hopefully, this post has helped you learn how to control the throughput in your Load Test project by using the mentioned plugins. Please find references to the plugins and manual from JMeter below. You can also find an attachment containing the scenario that was used to write this article (JMX file).&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Please leave us any questions or comments too. Thanks for reading!&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;References:&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;JMeter plugins wiki - &lt;/SPAN&gt;&lt;A href="https://jmeter-plugins.org/wiki/Start/" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;https://jmeter-plugins.org/wiki/Start/&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;JMeter user manual - &lt;/SPAN&gt;&lt;A href="https://jmeter.apache.org/usermanual/" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;https://jmeter.apache.org/usermanual/&lt;/SPAN&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Attachment:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 22 Mar 2021 18:15:25 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/simulating-targeted-throughput-for-load-testing-with-jmeter/ba-p/2227962</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-03-22T18:15:25Z</dc:date>
    </item>
    <item>
      <title>Test Automation and EasyRepro: 04 - Monitoring and Insights with EasyRepro</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-04-monitoring-and-insights-with/ba-p/2117974</link>
      <description>&lt;P&gt;&lt;SPAN&gt;The following is the fourth on a series of articles by&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://www.linkedin.com/in/aliyoussefi/" target="_blank" rel="noopener nofollow noreferrer"&gt;@Ali Youssefi&lt;/A&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;that we have been cross-posting into this Test Community Blog for a couple of months now. These articles were first published by Ali in the Dynamics community but since the topic related with Testing, Quality and Selenium, we though it would makes sense to publish here as well.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;If you didn't get a chance to catch the previous parts of these series, please have a look the links below:&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI class="md-end-block md-heading"&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-01-overview-and-getting-started/ba-p/1617726" target="_blank" rel="noopener"&gt;Test Automation and EasyRepro: 01 - Overview and Getting Started&lt;/A&gt;&lt;/LI&gt;
&lt;LI class="md-end-block md-heading"&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-02-designing-and-debugging-unit/ba-p/1853622" target="_blank" rel="noopener"&gt;Test Automation and EasyRepro: 02 - Designing and Debugging Unit Tests&lt;/A&gt;&lt;/LI&gt;
&lt;LI class="md-end-block md-heading"&gt;&lt;A title="Test Automation and EasyRepro: 03 - Extending the EasyRepro Framework" href="https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-03-extending-the-easyrepro/ba-p/2043985" target="_blank" rel="noopener"&gt;Test Automation and EasyRepro: 03 - Extending the EasyRepro Framework&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;Otherwise, please read ahead!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1 class="message-subject"&gt;&amp;nbsp;&lt;/H1&gt;
&lt;H1 class="md-end-block md-heading md-focus"&gt;&lt;SPAN class="md-plain"&gt;Summary&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://github.com/microsoft/easyrepro" target="_blank" rel="noopener"&gt;&lt;SPAN class="md-plain"&gt;EasyRepro&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is an open source framework built upon&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://www.seleniumhq.org/" target="_blank" rel="noopener"&gt;&lt;SPAN class="md-plain"&gt;Selenium&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;allowing automated UI tests to be performed on a specific Dynamics 365 organization. In this article we will discuss monitoring execution timings and delivering these to&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://docs.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview" target="_blank" rel="noopener"&gt;&lt;SPAN class="md-plain"&gt;Azure Application Insights&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;. We will look into the various timings within an execution, how to add tracing statements and finally to push events to Application Insights.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Getting Started&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain md-expand"&gt;If you haven't already, please review the previous articles showing how to&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://community.dynamics.com/crm/b/crminthefield/posts/test-automation-and-easyrepro-01---overview-and-getting-started" target="_blank" rel="noopener"&gt;create&lt;/A&gt;,&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://community.dynamics.com/crm/b/crminthefield/posts/test-automation-and-easyrepro-02---designing-and-debugging-unit-tests-522682578" target="_blank" rel="noopener"&gt;debug&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/A&gt;and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://community.dynamics.com/crm/b/crminthefield/posts/test-automation-and-easyrepro-03---extending-the-easyrepro-framework" target="_blank" rel="noopener"&gt;extend&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/A&gt;EasyRepro. This article assumes that the reader has this knowledge and will focus specifically on monitoring.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Command Timings&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Commands in EasyRepro unit tests represent an interaction with the browser to perform an action. Each command has a name, a start time, end time and other properties such as how many times it was attempted and was it successful. What's returned to the unit test is a list of command results represented by the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;ICommandResult&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;object.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Going to the definition for&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;ICommandResult&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;we see the following properties:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;These properties represent pretty much everything we need to know about a command result. However since this is a interface, it can be extended to include any other metric needed.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Now that we have the definition we need to dig deeper to better understand how these properties are populated. But before we get into that let's review the object that implements the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;ICommandResult&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;interface: the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;BrowserCommandResult&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;class.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Exploring the BrowserCommandResult class&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The image above shows the constructor for the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;BrowserCommandResult&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;class and three important attributes that represent collecting the start and stop time stamp as well as the value returned.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Exploring the BrowserCommand.cs file&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;BrowserCommand&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;object is where the actual command gets executed. It contains options describing tracing, retry policies, exception policy, etc. What's most important is the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Execute&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;method which performs the action from the unit test.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;When a command from a unit test is run (i.e.&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;GetValue&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;), it ultimately comes to this method to be performed. In the image above you can see the retry attempts are set as well as the tracing and timing (&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;result.Start()&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;). Once the command has finished the result and timings are returned in the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;BrowserCommandResult&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;object.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Execution Times&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The execution time for a command represents how long the command took to execute as shown in the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Execute&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;method in the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;BrowserCommand&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;class&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;result.Start&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;result.Stop&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;methods. Since we are focusing on timings these two methods are key. They are used to calculate the execution time we will use to monitor the performance of our unit test. These methods are shown in the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;BrowserCommandResult&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;image above and return a simple timestamp.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The execution time calculation takes the StopTime property and substracts from the StartTime to provide a number in milliseconds. This number is then set to the return value of our unit test command.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Think and Transition Times&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;You may have noticed above a couple of values for Think and Transition Times.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Think times&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;are built in mechanisms to put a thread to sleep. They can be used to allow actions to complete or represent a user wait in the UI. In the image above we see that the ThinkTime value is set to 2000 which is because inside of the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;OpenApp&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;method the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Browser.ThinkTime&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;method is run.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Transition time&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;value represents the time from the previous command end to the current command's start time and removing think times in between.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;How is all of this calculated?&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Inside of the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;InteractiveBrowser&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;class is a method called&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;CalculateResults&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;which is called from the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Execute&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;method described above. In the image above you can see think time is straight forward, it comes from the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;CommandThinkTimes&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;property.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The transition time is a calculation adds the seconds and millisecond differences between the previous command and current command then subtracts the think time. All three of these timings can help us better understand where long running commands are coming from and where we could possibly tune unit tests by reducing think times between unit test commands.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Logging and Monitoring&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Debug and Trace&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The ability to provide output statements is essentially for any type of unit testing including ones built using the EasyRepro framework. Typically you see statements such as&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Console.WriteLine&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;or&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Debug.WriteLine&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;used in the unit test link in the image below.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Its important to note that these same lines can be added to the EasyRepro framework if you choose. Here are two images showing the output from the Debug window and the output from the test result itself.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;Debug window:&lt;/SPAN&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;Test Result Window:&lt;/SPAN&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;You can see the test output shows only the WriteLine methods I added while removing the debug information from Visual Studio. Utilizing this technique is key to providing detailed information to the developer and testing teams to understand how a unit test is performing. This output will also be included in the test results file which will help us once we begin automating unit testing.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Application Insights&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Application Insights is an extensible Application Performance Management (APM) service that can be used to monitor applications, tests, etc. Source:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://docs.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview" target="_blank" rel="noopener"&gt;&lt;SPAN class="md-plain"&gt;Application Insights Overview&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;In this section we will cover how to setup the Telemetry Client to be used by your unit tests and how to push command timings to Application Insights. Its assumed you have already setup an Application Insights resource and have the instrumentation key. For help on setting this up refer to&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://docs.microsoft.com/en-us/azure/azure-monitor/learn/nodejs-quick-start" target="_blank" rel="noopener"&gt;&lt;SPAN class="md-plain"&gt;this article&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;detailing enabling and configuring Application Insights.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Setup Application Insights Telemetry Client&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Begin by ensuring you have the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Microsoft.ApplicationInsights&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;NuGet package installed. As of this writing I'm using the v2.4.0 which is included in the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Microsoft.Dynamics365.UIAutomation.Sample&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;unit test project from GitHub.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Next, navigate to your app.settings file and add the Instrumentation Key to the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AzureKey&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;key.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Once that's done we need to setup the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;TelemetryClient&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and give it our key. Once complete we are now ready to send messages to Application Insights.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Push Timings to Application Insights&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Once the unit test has completed all of the EasyRepro actions we are going to send the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;CommandResults&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;collection to Application Insights. From the previous section we detailed that each command result includes the Start and End times as well as calculated timing such as execution, think and transition times.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;In the image above you can see how to loop through each command result and set the property and metric bags for the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;CustomEvent&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;table in Application Insights. The telemetry client includes methods for each type of table in Application Insights so you can also include items like exceptions, navigation timings, etc in the appropriate table. Review&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://docs.microsoft.com/en-us/azure/azure-monitor/app/api-custom-events-metrics" target="_blank" rel="noopener"&gt;&lt;SPAN class="md-plain"&gt;this document&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;for additional information.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Next Steps&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Expanding messages sent to Application Insights&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The example above shows how to collect and send timings for each command to Application Insights which is useful to understand how the test and platform are performing. In addition you may want to think about adding additional contextual details about each unit test run such as who is running the test, where its running and information about the org that the test is running on. As you can see the property and metric bags are dictionaries that can be added to to include these detail points. There are also table columns native to each specific table that can be leveraged as well to house these data points.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;One area of the platform that gets overlooked is the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Performance Center&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;which is extremely useful for understanding page load timings. These markers are accurate representations of a page load. They can be extracted and sent to Application Insights as well. Check out the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;SharedTestUploadTelemetry&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;sample unit test for more information. This test uses the legacy UI however EasyRepro can be extended to utilize the Performance Center in the unified interface as well. Please refer to the previous section for extending EasyRepro for techniques to accommodate this.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Conclusion&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;In this article we have explored EasyRepro commands and how the timings for each command are gathered. We discussed logging techniques within our unit tests. We setup Application Insights within an EasyRepro unit test and pushed messages from our test. Finally we discussed adding additional data points to our messages.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Please refer to the the previous articles for extending and debugging EasyRepro unit tests. For the next article we will work to incorporate changes to EasyRepro unit tests into an Azure Build Pipeline using Continuous Integration. This will be our first step into adding EasyRepro as a quality gate for our DevOps process!&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 11 Feb 2021 19:31:02 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-04-monitoring-and-insights-with/ba-p/2117974</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-02-11T19:31:02Z</dc:date>
    </item>
    <item>
      <title>Get Started with Cucumber and Azure DevOps!</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/get-started-with-cucumber-and-azure-devops/ba-p/2094639</link>
      <description>&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;" lang="en-GB"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;" lang="en-GB"&gt;By Anusha Ammaluru&lt;/P&gt;
&lt;P style="margin-top: 0pt; margin-bottom: 8pt; font-family: Calibri; font-size: 11.0pt;" lang="en-GB"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This time we bring you a blog article about Cucumber, Selenium and Integration with Azure DevOps, let's get started and welcome to the journey to learn Cucumber.&lt;/P&gt;
&lt;P&gt;The blog post will cover the following topics:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Cucumber Introduction&lt;/LI&gt;
&lt;LI&gt;Setup Cucumber with Selenium in Eclipse&lt;/LI&gt;
&lt;LI&gt;Cucumber Basics&lt;/LI&gt;
&lt;LI&gt;Eclipse Integration with Azure DevOps&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="6"&gt;Cucumber Introduction&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Cucumber is a tool that supports&amp;nbsp;&lt;A href="https://cucumber.io/docs/bdd" target="_blank" rel="noopener"&gt;Behaviour-Driven Development(BDD)&lt;/A&gt;. It lets us define application behavior&amp;nbsp;in plain meaningful English text using&amp;nbsp;a simple grammar defined by a language called &lt;STRONG&gt;Gherkin&lt;/STRONG&gt;.&amp;nbsp;Cucumber itself is written in&amp;nbsp;&lt;STRONG&gt;Ruby&lt;/STRONG&gt;, but it can be used to “test” code written in&amp;nbsp;Ruby&amp;nbsp;or other languages.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Cucumber is one of the most powerful tools. It offers us the real communication layer on top of a robust testing framework. The tool can help run automation tests on wide-ranging testing needs from the backend to the frontend. Moreover, Cucumber creates deep connections among members of the testing team, which we hardly found in other testing frameworks.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;I&gt;What is Gherkin? &lt;/I&gt;&lt;/STRONG&gt;It&amp;nbsp;is a simple, lightweight, and structured language, which uses regular spoken&amp;nbsp;language to describe user requirements and scenarios. Examples of&amp;nbsp;regular spoken language are English, French, and around 30 more languages. Gherkin contains a set of syntax/keywords&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT color="#0000FF"&gt;&lt;STRONG&gt;&lt;I&gt;Feature&lt;/I&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt;&lt;I&gt;: Defines the feature (generally a user story)&lt;/I&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT color="#0000FF"&gt;&lt;STRONG&gt;&lt;I&gt;Given&lt;/I&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt;&lt;I&gt;: Specifies the pre-condition of the test&lt;/I&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT color="#0000FF"&gt;&lt;STRONG&gt;&lt;I&gt;And&lt;/I&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt;&lt;I&gt;: Defines additional conditions of the test&lt;/I&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT color="#0000FF"&gt;&lt;STRONG&gt;&lt;I&gt;Then&lt;/I&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;STRONG&gt;&lt;I&gt;: States the post-condition/expected result of the test&lt;/I&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Key points to note:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The test is written in plain English, which is common to all the domains of your project team.&lt;/LI&gt;
&lt;LI&gt;This test is structured that makes it capable of being read in an automated way. Thereby creating automation tests at the same time while describing the scenario.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="6"&gt;Setup Cucumber with Selenium in Eclipse&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Setup java
&lt;UL&gt;
&lt;LI&gt;Download the latest version of Java from &lt;A href="https://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank" rel="noopener"&gt;https://www.oracle.com/technetwork/java/javase/downloads/index.html&lt;/A&gt;&amp;nbsp;
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: #212529;" lang="en-GB"&gt;&lt;SPAN style="background: white;"&gt;Download .exe file&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN style="background: white;"&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Install Java by double-clicking on the .exe file and proceed with default options&lt;/LI&gt;
&lt;LI&gt;Set up Java Environment Path
&lt;UL&gt;
&lt;LI&gt;Type Env in the windows search and click on the ‘Environment Variables’ option
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Click on Path in the System variables and click the ‘Edit’ button
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Add folder path where the JDK is installed and click the 'OK' button
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Go to&amp;nbsp;&lt;STRONG&gt;&lt;I&gt;Command Prompt&lt;/I&gt;&lt;/STRONG&gt;&amp;nbsp;and type&amp;nbsp;&lt;STRONG&gt;&lt;I&gt;java -version&lt;/I&gt;&lt;/STRONG&gt;&amp;nbsp;If you see a screen like below, Java is installed
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN style="font-family: inherit;"&gt;Setup Eclipse&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;Download Eclipse Photon from &lt;A style="background-color: #ffffff;" href="https://www.eclipse.org/downloads/packages/release/photon/rc3" target="_blank" rel="noopener"&gt;https://www.eclipse.org/downloads/packages/release/photon/rc3&lt;/A&gt;, if you are going to maintain the repo in Azure DevOps, I had faced issues earlier with other bundles.
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Select Eclipse IDE for Java Developers and Install
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Launch the eclipse and select a workspace folder to save your repo&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;Install Cucumber Plugin for Eclipse&amp;nbsp;
&lt;UL&gt;
&lt;LI&gt;June, 2021 UPDATE: The recommended way to install cucumber is now through the Eclipse Marketplace, although installing it through the Eclipse Update Site is still an option (with the new URL).&lt;/LI&gt;
&lt;LI&gt;Check here for all the supported ways to install Cucumber for Eclipse (&lt;A href="https://github.com/cucumber/cucumber-eclipse-update-site" target="_blank" rel="noopener noreferrer"&gt;https://github.com/cucumber/cucumber-eclipse-update-site&lt;/A&gt;).&lt;/LI&gt;
&lt;LI&gt;To install through the Eclipse Marketplace:
&lt;UL&gt;
&lt;LI&gt;Directly from the Eclipse marketplace. Go to&amp;nbsp;&lt;CODE&gt;Help&lt;/CODE&gt;&amp;nbsp;&amp;gt;&amp;nbsp;&lt;CODE&gt;Eclipse Marketplace&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;Search&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://marketplace.eclipse.org/content/cucumber-eclipse-plugin" target="_blank" rel="nofollow noopener"&gt;&lt;CODE&gt;Cucumber Eclipse Plugin&lt;/CODE&gt;&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Or, go to this url:&amp;nbsp;&lt;A href="https://github.com/cucumber/cucumber-eclipse-update-site," target="_blank" rel="noopener"&gt;https://github.com/cucumber/cucumber-eclipse-update-site,&lt;/A&gt;&amp;nbsp;and&amp;nbsp;drag and drop the &lt;STRONG&gt;Install&lt;/STRONG&gt; button in your running Eclipse workspace.&lt;/LI&gt;
&lt;LI&gt;&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;To install through the Eclipse Update Site:
&lt;UL&gt;
&lt;LI&gt;From Eclipse, go to menu&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;Help&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&amp;gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;Install New software&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;Work with:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;&lt;A href="https://cucumber.github.io/cucumber-eclipse/update-site" target="_blank" rel="noopener"&gt;https://cucumber.github.io/cucumber-eclipse/update-site&lt;/A&gt;&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;Select the check-box for&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;Cucumber Eclipse Plugin&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;Select Next as per the instruction shown during installation.&lt;/LI&gt;
&lt;LI&gt;Restart your Eclipse after completion of instruction.&lt;/LI&gt;
&lt;LI&gt;Now latest version of cucumber-eclipse plugin is installed successfully in your Eclipse.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;&amp;nbsp; Download Cucumber JARS from Maven Repo
&lt;UL&gt;
&lt;LI&gt;Go to&amp;nbsp;&lt;A href="https://search.maven.org/" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;&lt;I&gt;https://search.maven.org&lt;/I&gt;&lt;/STRONG&gt;&lt;/A&gt;&lt;I&gt;.&lt;/I&gt;&lt;/LI&gt;
&lt;LI&gt;Search for&amp;nbsp;&lt;STRONG&gt;&lt;I&gt;cucumber-core&lt;/I&gt;&lt;/STRONG&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;in the Central Maven Repository.&lt;/LI&gt;
&lt;LI&gt;Download jar file&lt;/LI&gt;
&lt;LI&gt;Similarly, search for all the below libs in the Maven repo and download JAR’s
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;OL start="5"&gt;
&lt;LI&gt;Download Selenium
&lt;UL&gt;
&lt;LI&gt;Download WebDriver Java client from &lt;A href="https://www.selenium.dev/downloads/" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;&lt;I&gt;Selenium website&lt;/I&gt;&lt;/STRONG&gt;&lt;/A&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;I&gt;&lt;img /&gt;&lt;/I&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Extract the files and save it in your local folder&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;OL start="6"&gt;
&lt;LI&gt;Configure Eclipse with Cucumber and Selenium WebDriver libs
&lt;UL&gt;
&lt;LI&gt;Go to Eclipse : File-&amp;gt; New -&amp;gt; Project -&amp;gt; Select Maven
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Click the 'Next' button
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Filter Cucumber and select cucumber-archetype
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Enter Group Id and Artifact Id and click the ‘Finish’ button
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;I&gt;Add Selenium Jars&lt;/I&gt;&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Right-click on Project ‘&lt;STRONG&gt;&lt;I&gt;CucumberTest &amp;gt; Select Properties &amp;gt; Java build path.&amp;nbsp;&lt;/I&gt;&lt;/STRONG&gt;Then&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;navigate to the&amp;nbsp;&lt;STRONG&gt;&lt;I&gt;Libraries&lt;/I&gt;&lt;/STRONG&gt;&lt;I&gt;&amp;nbsp;&lt;/I&gt;tab and click&amp;nbsp;&lt;STRONG&gt;&lt;I&gt;Add External JARs&lt;/I&gt;&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Browse to the local folder where the selenium jars are saved and select all the jars and add
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Go to the lib folder and add all the remaining Jars
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Click ok&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Add Cucumber Jars
&lt;UL&gt;
&lt;LI&gt;Right-click on Project ‘&lt;STRONG&gt;&lt;I&gt;CucumberTest &amp;gt; Select Properties &amp;gt; Java build path.&amp;nbsp;&lt;/I&gt;&lt;/STRONG&gt;Then&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;navigate to the&amp;nbsp;&lt;STRONG&gt;&lt;I&gt;Libraries&lt;/I&gt;&lt;/STRONG&gt;&lt;I&gt;&amp;nbsp;&lt;/I&gt;tab and click&amp;nbsp;&lt;STRONG&gt;&lt;I&gt;Add External JARs&lt;/I&gt;&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Browse to the local folder where the cucumber jars are saved and select all the jars and add
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Click the 'Ok' button&lt;/LI&gt;
&lt;LI&gt;Now we are all set &lt;span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:"&gt;😊&lt;/span&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="6"&gt;Cucumber Basics&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Cucumber Feature File
&lt;UL&gt;
&lt;LI&gt;An entry point to the&amp;nbsp;&lt;I&gt;Cucumber&lt;/I&gt;&lt;SPAN style="font-family: inherit;"&gt;&amp;nbsp;tests. It contains a list of scenarios/test cases written in natural English language using Gherkin keywords&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Create a package in eclipse project -&amp;gt; name it as ‘Features’
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Right-click on the ‘Features’ package and create a file -&amp;gt; name it as ‘DemoTest.feature’
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Add a Feature: Name and description and a scenario underneath like the below example
&lt;UL&gt;
&lt;LI&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Step Definitions
&lt;UL&gt;
&lt;LI&gt;Add selenium java code in the step definition methods corresponding to feature files.&lt;/LI&gt;
&lt;LI&gt;Sample code:&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;@Given("&lt;FONT color="#0000FF"&gt;user is on home page&lt;/FONT&gt;")&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;FONT color="#993366"&gt;&lt;STRONG&gt;public void&lt;/STRONG&gt; &lt;/FONT&gt;user_is_on_home_page() {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;driver&lt;/FONT&gt;.get("&lt;FONT color="#0000FF"&gt;&lt;A href="https://pul-ai-anu.azurewebsites.net/" target="_blank" rel="noopener"&gt;https://pul-ai-anu.azurewebsites.net/&lt;/A&gt;&lt;/FONT&gt;");&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;FONT color="#0000FF"&gt;driver&lt;/FONT&gt;.manage().timeouts().pageLoadTimeout(100, TimeUnit.&lt;FONT color="#0000FF"&gt;&lt;STRONG&gt;&lt;I&gt;SECONDS&lt;/I&gt;&lt;/STRONG&gt;&lt;/FONT&gt;);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;@When("&lt;FONT color="#0000FF"&gt;I click on login link&lt;/FONT&gt;")&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;FONT color="#993366"&gt;&lt;STRONG&gt;public void&lt;/STRONG&gt; &lt;/FONT&gt;i_click_on_login_link() {&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;login&lt;/FONT&gt; = &lt;FONT color="#993366"&gt;&lt;STRONG&gt;new&lt;/STRONG&gt; &lt;/FONT&gt;LoginPage(driver);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;login.lnk_Login&lt;/FONT&gt;.click();&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;driver&lt;/FONT&gt;.manage().timeouts().implicitlyWait(20, TimeUnit.&lt;FONT color="#0000FF"&gt;&lt;STRONG&gt;&lt;I&gt;SECONDS&lt;/I&gt;&lt;/STRONG&gt;&lt;/FONT&gt;);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;@When("&lt;FONT color="#0000FF"&gt;I enter username {string}&lt;/FONT&gt;")&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;FONT color="#993366"&gt;&lt;STRONG&gt;public void&lt;/STRONG&gt; &lt;/FONT&gt;i_enter_username(String email) {&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;login&lt;/FONT&gt; = &lt;FONT color="#993366"&gt;&lt;STRONG&gt;new&lt;/STRONG&gt; &lt;/FONT&gt;LoginPage(driver);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;login.txtbx_UserName&lt;/FONT&gt;.sendKeys(email);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;driver&lt;/FONT&gt;.manage().timeouts().implicitlyWait(20, TimeUnit.&lt;FONT color="#0000FF"&gt;&lt;STRONG&gt;&lt;I&gt;SECONDS&lt;/I&gt;&lt;/STRONG&gt;&lt;/FONT&gt;);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;@@When("&lt;FONT color="#0000FF"&gt;I enter password {string}&lt;/FONT&gt;"&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;FONT color="#993366"&gt;&lt;STRONG&gt;public void&lt;/STRONG&gt; &lt;/FONT&gt;i_enter_password(String password) {&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;login&lt;/FONT&gt; = &lt;FONT color="#993366"&gt;&lt;STRONG&gt;new&lt;/STRONG&gt; &lt;/FONT&gt;LoginPage(&lt;FONT color="#0000FF"&gt;driver&lt;/FONT&gt;);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;login.txtbx_Password&lt;/FONT&gt;.sendKeys(password);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;driver&lt;/FONT&gt;.manage().timeouts().implicitlyWait(20, TimeUnit.&lt;FONT color="#0000FF"&gt;&lt;STRONG&gt;&lt;I&gt;SECONDS&lt;/I&gt;&lt;/STRONG&gt;&lt;/FONT&gt;);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;@When("&lt;FONT color="#0000FF"&gt;I click on login button&lt;/FONT&gt;")&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;FONT color="#993366"&gt;&lt;STRONG&gt;public void&lt;/STRONG&gt; &lt;/FONT&gt;i_click_on_login_button() {&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;login&lt;/FONT&gt; = &lt;FONT color="#993366"&gt;&lt;STRONG&gt;new&lt;/STRONG&gt; &lt;/FONT&gt;LoginPage(&lt;FONT color="#0000FF"&gt;driver&lt;/FONT&gt;);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;login.btn_Login&lt;/FONT&gt;.click();&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;driver&lt;/FONT&gt;.manage().timeouts().pageLoadTimeout(100, TimeUnit.&lt;FONT color="#0000FF"&gt;&lt;STRONG&gt;&lt;I&gt;SECONDS&lt;/I&gt;&lt;/STRONG&gt;&lt;/FONT&gt;);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;@Then("&lt;FONT color="#0000FF"&gt;I verify the login is successful&lt;/FONT&gt;")&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;FONT color="#993366"&gt;&lt;STRONG&gt;public void&lt;/STRONG&gt; &lt;/FONT&gt;i_verify_the_login_is_successful() {&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#0000FF"&gt;&amp;nbsp;login&lt;/FONT&gt; = &lt;FONT color="#993366"&gt;&lt;STRONG&gt;new&lt;/STRONG&gt; &lt;/FONT&gt;LoginPage(&lt;FONT color="#0000FF"&gt;driver&lt;/FONT&gt;);&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#993366"&gt;&amp;nbsp;&lt;STRONG&gt;assert&lt;/STRONG&gt;&lt;/FONT&gt;(&lt;FONT color="#0000FF"&gt;login.lnk_profile&lt;/FONT&gt;.isEnabled());&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Junit Test Runner Class&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;package runner;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;STRONG&gt;&lt;FONT color="#993366"&gt;import&lt;/FONT&gt; &lt;/STRONG&gt;io.cucumber.junit.Cucumber;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#993366"&gt;&lt;STRONG&gt;import&lt;/STRONG&gt; &lt;/FONT&gt;io.cucumber.junit.CucumberOptions;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;STRONG&gt;&lt;FONT color="#993366"&gt;import&lt;/FONT&gt; &lt;/STRONG&gt;org.junit.runner.RunWith;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;@RunWith(Cucumber.class)&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;@CucumberOptions(plugin = {"&lt;FONT color="#0000FF"&gt;pretty&lt;/FONT&gt;"},&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;features= "&lt;FONT color="#0000FF"&gt;src\\test\\resources\\features&lt;/FONT&gt;" ,&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;glue= "&lt;FONT color="#0000FF"&gt;stepDefinitions&lt;/FONT&gt;")&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&lt;FONT color="#993366"&gt;&lt;STRONG&gt;public class&lt;/STRONG&gt; &lt;/FONT&gt;RunCucumberTest {&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-120px"&gt;}&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Right-click on&amp;nbsp;&lt;STRONG&gt;TestRunner&lt;/STRONG&gt;&amp;nbsp;class and Click&amp;nbsp;&lt;STRONG&gt;Run As&lt;/STRONG&gt;&amp;nbsp; &amp;gt;&amp;nbsp;&lt;STRONG&gt;JUnit Test Application&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;Test Run Report will be shown like this&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="6"&gt;Eclipse Integration with Azure DevOps&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Reference link: &lt;A href="https://docs.microsoft.com/en-us/azure/devops/java/labs/eclipsegit/?view=azure-devops" target="_blank" rel="noopener"&gt;https://docs.microsoft.com/en-us/azure/devops/java/labs/eclipsegit/?view=azure-devops &lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;If you face issues in accessing the Teams Explorer, follow the below workaround
&lt;UL&gt;
&lt;LI&gt;Credits: &lt;A style="font-family: inherit; background-color: #ffffff;" href="https://github.com/Microsoft/team-explorer-everywhere/issues/285#issuecomment-474944707" target="_blank" rel="noopener"&gt;https://github.com/Microsoft/team-explorer-everywhere/issues/285#issuecomment-474944707&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Download jaxb-api-osgi jar from Maven Central (&lt;A href="https://search.maven.org/search?q=g:javax.xml.bind%20AND%20a:jaxb-api-osgi&amp;amp;core=gav" target="_blank" rel="noopener"&gt;https://search.maven.org/search?q=g:javax.xml.bind%20AND%20a:jaxb-api-osgi&amp;amp;core=gav&lt;/A&gt;)&lt;/LI&gt;
&lt;LI&gt;Copy/move this jar to your eclipse/dropins directory&lt;/LI&gt;
&lt;LI&gt;Edit eclipse/plugins/com.microsoft.tfs.core_14.134.0.201804261732/META-INF/MANIFEST.MF&lt;/LI&gt;
&lt;LI&gt;append ",javax.xml.bind" to the "Import-Packages" line. It should look like this when complete:
&lt;UL&gt;
&lt;LI&gt;Import-Package: org.eclipse.equinox.security.storage,javax.xml.bind&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;restart eclipse with -clean option so OSGi bundles are recomputed&lt;/LI&gt;
&lt;LI&gt;Right-click on the project -&amp;gt; Team and you will have the rest of the git operations&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_22" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;FONT size="6"&gt;Conclusion&lt;/FONT&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;I have created a sample Java Maven project using the Selenium Page factory and Cucumber in GitHub &lt;A href="https://github.com/anu-01/CucumberSelenliumPageFactory" target="_blank" rel="noopener"&gt;https://github.com/anu-01/CucumberSelenliumPageFactory&lt;/A&gt;. This is a great place to get started with a Cucumber-based framework.&lt;/P&gt;</description>
      <pubDate>Thu, 03 Jun 2021 12:31:01 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/get-started-with-cucumber-and-azure-devops/ba-p/2094639</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-06-03T12:31:01Z</dc:date>
    </item>
    <item>
      <title>Test Automation and EasyRepro: 03 - Extending the EasyRepro Framework</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-03-extending-the-easyrepro/ba-p/2043985</link>
      <description>&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;The following is the third on a series of articles by&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://www.linkedin.com/in/aliyoussefi/" target="_blank" rel="noopener nofollow noopener noreferrer noopener noreferrer"&gt;@Ali Youssefi&lt;/A&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;that we will be cross-posting into this Test Community Blog. These articles were first published by Ali in the Dynamics community but since the topic is very related with Testing it makes sense to publish here as well.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;If you didn't get a chance to catch the first one of the series, please have a look here:&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI class="md-end-block md-heading"&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-01-overview-and-getting-started/ba-p/1617726" target="_blank" rel="noopener"&gt;Test Automation and EasyRepro: 01 - Overview and Getting Started&lt;/A&gt;&lt;/LI&gt;
&lt;LI class="md-end-block md-heading"&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-02-designing-and-debugging-unit/ba-p/1853622" target="_blank" rel="noopener"&gt;Test Automation and EasyRepro: 02 - Designing and Debugging Unit Tests &lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="md-end-block md-heading"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Otherwise, please read ahead!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="color: inherit; font-size: 30px;"&gt;Summary&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p md-focus"&gt;&lt;SPAN class="md-link"&gt;&lt;A href="https://github.com/microsoft/easyrepro" target="_blank" rel="noopener"&gt;&lt;SPAN class="md-plain"&gt;EasyRepro&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is an open source framework built upon&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://www.seleniumhq.org/" target="_blank" rel="noopener"&gt;&lt;SPAN class="md-plain"&gt;Selenium&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain md-expand"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;allowing automated UI tests to be performed on a specific Dynamics 365 organization. This article will focus on reviewing how EasyRepro works with the Document Object Model otherwise known as the DOM. This will help us understand how we can extend the EasyRepro code for use with custom objects or areas of the platform not included in the framework at this time. We will wrap with a brief look at XPath and referencing elements from the DOM.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p md-focus"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Getting Started&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;If you haven't already, check out the first article which covers getting familiar with EasyRepro and working with the source code locally. It covers&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://raw.githubusercontent.com/aliyoussefi/D365-Testing/master/Media/Blogs/Blog1/Clone%20from%20GitHub%20to%20Azure%20DevOps.gif" target="_blank" rel="noopener"&gt;&lt;SPAN class="md-plain"&gt;cloning from GitHub to Azure DevOps&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;then from&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://raw.githubusercontent.com/aliyoussefi/D365-Testing/master/Media/Blogs/Blog1/Clone%20locally%20from%20Azure%20DevOps.gif" target="_blank" rel="noopener"&gt;&lt;SPAN class="md-plain"&gt;Azure DevOps Git repository to a development machine&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;. and reviews setting up dependencies and test settings to run a simple test. The second article goes into common actions performed by users when interacting with Dynamics 365 and the correlating EasyRepro commands. It wraps with covering common troubleshooting and debugging scenarios.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The EasyRepro framework contains an abundance of commands that should suit most of your needs. However you'll find that at times either these commands will need to be modified per your customizations or you may need to create your own custom commands for reuse among tests.&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Some example scenarios for modifying or creating custom commands may include:&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL class="ol-list" start="1"&gt;
&lt;LI class="md-list-item"&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Using an ADFS Redirect Login&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="md-list-item"&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Working with custom components and resources&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="md-list-item"&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Working with strongly typed entity attributes&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="md-list-item"&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Including navigation and functionality not present natively in the framework&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;These scenarios require an understanding of how EasyRepro interacts with Selenium to simulate user actions in a browser. This article will focus on a typical use case for extension: the Login process. We will describe common Selenium functionality and how to reference elements on the Document Object Model in a way to increase maintainability.&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Sample Scenarios for Extending&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Working with the Browser Driver&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;As we discussed earlier, your organization's login process may have a sign on page that a user will get redirected to once they input their username. This is where we begin our journey into extending the framework and utilizing Selenium.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;Typical Single Sign On Page:&lt;/SPAN&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;Custom method for a Single Sign On Page:&lt;/SPAN&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;H1 class="md-end-block md-heading"&gt;&amp;nbsp;&lt;/H1&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The image above shows a method designed to search through a sign in page DOM for input fields for credentials and submission. You will notice that we are working with the browser driver natively (&lt;EM&gt;&lt;STRONG&gt;args.Driver&lt;/STRONG&gt;&lt;/EM&gt;) and using methods not found in the sample EasyRepro unit tests. These include&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://www.guru99.com/find-element-selenium.html" target="_blank" rel="noopener"&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;FindElement&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;which is part of Selenium and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;WaitForPageToLoad&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;which is part of EasyRepro's extension of Selenium. I'll touch on these at a high level now.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;FindElement&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://www.guru99.com/find-element-selenium.html" target="_blank" rel="noopener"&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;FindElement&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is part of the Selenium.WebDriver assembly and is used to find an element in the DOM. I'll cover how to search through the DOM in the next section&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;&amp;nbsp;Extending and Working with XPath&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;but I wanted to take this time to show how we will begin extending unit tests using Selenium natively.&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;The&amp;nbsp; method returns an&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;IWebElement&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;object that represents the element you want to work with. For instance if you want to work with the username textbox you can use&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;FindElement&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;to locate and return the username textbox. Once returned the framework can interact with it and perform actions such as input text or click.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Reference:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-link"&gt;&lt;A href="https://www.toolsqa.com/selenium-webdriver/c-sharp/findelement-and-findelements-commands-in-c/" target="_blank" rel="noopener"&gt;https://www.toolsqa.com/selenium-webdriver/c-sharp/findelement-and-findelements-commands-in-c/&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;WaitForPageToLoad&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;WaitForPageToLoad&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is part of the EasyRepro framework as a Selenium extension. This is key to point out that we are leveraging both EasyRepro and Selenium natively to achieve our desired result to login. This method waits a specific amount of time and checks for the document ready state. The time interval used to check can be adjusted if needed.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;SendKeys and Clear&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://www.guru99.com/accessing-forms-in-webdriver.html" target="_blank" rel="noopener"&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;SendKeys&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is used to send keystrokes to an element on the page. This can be a complete string such as an email or a single keypress. This can be used to send the username and password to your sign in page. It also can be used to send the Enter or Tab keypress to move to the next field or submit.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://www.guru99.com/accessing-forms-in-webdriver.html" target="_blank" rel="noopener"&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Clear&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;as it sounds is used to remove any sort of input that may already exist in an element. This is useful if your sign in page attempts to automatically input credentials.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;Both of these methods are part of the&amp;nbsp;&lt;STRONG&gt;IWebElement&lt;/STRONG&gt;&amp;nbsp;shown above. Other useful properties of&amp;nbsp;&lt;STRONG&gt;IWebElement&lt;/STRONG&gt;&amp;nbsp;include&amp;nbsp;&lt;STRONG&gt;Text&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;Selected&lt;/STRONG&gt;&amp;nbsp;and&amp;nbsp;&lt;STRONG&gt;GetAttribute&lt;/STRONG&gt;.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Understanding how to extend element references&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Considerations need to be made when designing unit tests to help reduce the maintenance work needed if something changes. For instance when referencing custom HTML web resources or even the ADFS Redirect from above, think how a change to an element in the DOM could propagate across some of all of your unit tests. One way to control maintenance is to centralize commonly used references into proxy objects that can hide the underlying mechanics from the test designer. This is exactly how the EasyRepro framework handles references and when extending can leverage the same approach. In this section we will cover the files used by the framework to reference DOM elements and show how to extend them to include references to our custom login page.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;The App Element Reference File&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The Microsoft.Dynamics365.UIAutomation.Api.UCI project uses the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;ElementReference.cs&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;file as well as another file called&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppElementReference.cs&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;. The&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;ElementReference&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;file looks to have been brought over from the classic interface. What's unique about each is how they reference elements in the DOM which I'll cover in the next section. For now let's focus on reviewing the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppElementReference.cs&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;file which is located in the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;DTO&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;folder of the Microsoft.Dynamics365.UIAutomation.Api.UCI project.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Inside of the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppElementReference&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;file are two objects used by EasyRepro to represent and locate elements: The&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppReference&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppElements&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;classes.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;The AppReference class&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppReference&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;class includes sub classes that represent the objects used by EasyRepro, specifically the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;WebClient&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;object, to connect to DOM elements. This allows the framework to standardize how the search for a particular container or element is performed. Centralizing the reference to the DOM elements will allow the test designer to focus on writing commands against common objects and not specifying the precise location of an element in the DOM.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;The AppElement class&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppElement&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;class is a comma delimited key value pair consisting of the reference object property as a key and the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;XPath&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;command as the value. The key represents the property name in the class object inside of&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppReference&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;while the value is the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;XPath&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;location of the element in the DOM.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;I highly suggest reviewing the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppElement&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;class when extending EasyRepro as it shows recommended ways to locate and reference elements on the DOM. In the next section we will discuss the different ways you can locate elements including&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;XPath&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Referencing elements in the Document Object Model&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;References to objects generally fall into four patterns:&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL class="ol-list" start="1"&gt;
&lt;LI class="md-list-item"&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Resolving via Control Name&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="md-list-item"&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Resolving via XPath&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="md-list-item"&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Resolving by Element ID&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="md-list-item"&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Resolving by CSS Class&lt;/SPAN&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;In this article we will focus on XPath which is what is primarily used by the EasyRepro framework for the Dynamics 365 platform. However its key to understand each of the approaches for referencing as they can be used for customizations such as web resources, custom controls, etc.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Resolve with Control Name&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;This will search the DOM for elements with a specific name which is an attribute on the element node. This is not used by EasyRepro to my knowledge.&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;Elements can be found by their name by using&amp;nbsp;&lt;EM&gt;&lt;STRONG&gt;By.TagName&lt;/STRONG&gt;&lt;/EM&gt;&amp;nbsp;with the&amp;nbsp;&lt;STRONG&gt;FindElement&lt;/STRONG&gt;&amp;nbsp;method.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Resolve with Element ID&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;This will attempt to find an element by its unique identifier. For instance a textbox on the login form maybe identified as 'txtUserName'. Assuming this element ID is unique we could search for this particular element by an ID and return an&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;IWebElement&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;representation. An example from the Microsoft.Dynamics365.UIAutomation.Api.UCI project is shown below showing usage with the timeline control.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;Definition:&lt;/SPAN&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;Usage by&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;WebClient&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN class="md-plain"&gt;:&lt;/SPAN&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;FONT size="2"&gt;&lt;SPAN&gt;&lt;SPAN class="md-plain"&gt;Elements can be found by their ID by using&amp;nbsp;&lt;EM&gt;&lt;STRONG&gt;By.Id&lt;/STRONG&gt;&lt;/EM&gt;&amp;nbsp;with the&amp;nbsp;&lt;STRONG&gt;FindElement&lt;/STRONG&gt;&amp;nbsp;method.&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Resolve with CSS Class&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;This allows the ability to search by the CSS class defined on the element. Be aware that this can return multiple elements due to the nature of CSS class. There is no usage of this in EasyRepro but again this could be helpful for customizations.&amp;nbsp;&lt;SPAN&gt;Elements can be found by their CSS class name by using&amp;nbsp;&lt;EM&gt;&lt;STRONG&gt;By.Class&lt;/STRONG&gt;&lt;/EM&gt;&amp;nbsp;with the&amp;nbsp;&lt;STRONG&gt;FindElement&lt;/STRONG&gt;&amp;nbsp;method.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Resolve with XPath&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;XPath allows us to work quickly and efficiently to search for a known element or path within the DOM. Key functions include the contains method which allow to search node attributes or values. For instance when you review the DOM of a form you'll notice attributes such as data-id or static text housed within a span element. Coupling this attribute with the html tag can result in a surprisingly accurate way to locate an element. I suggest leveraging the current element class as well as&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://www.w3schools.com/XML/xml_xpath.asp" target="_blank" rel="noopener"&gt;&lt;SPAN class="md-plain"&gt;this link from W3 Schools&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;that goes into the schema of XPath.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Going back to an earlier section let's review how XPath along with the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppElementReference.cs&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;file can help standardize element location.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Using XPath in the ADFS Redirect Login Method&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Going back to our original example for the ADFS login method below you'll see an example of referencing the DOM elements using XPath directly with the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Selenium&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;objects driver and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;By.XPath&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;. Consider the below two images:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;Without a static representation of XPath:&lt;/SPAN&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;Using static classes to represent XPath queries:&lt;/SPAN&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Both of these methods work and perform exactly the same. However the second method provides increased supportability if and when the login page goes through changes. For instance consider if the id of the textbox to input your username changes from txtUserName to txtLoginId. Also what if this txtUserName XPath query is propagated across hundreds or more unit tests?&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Creating custom reference objects&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Let's put what we have learned to use by creating a reference to our custom login page. Start by adding a class to the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppReference&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;object and title it&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;&lt;SPAN class="md-plain"&gt;AdfsLogin&lt;/SPAN&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;. Inside this class declare string properties that will be used as input for your organization's login page. Typical inputs include username, password and a submit button. Here is an example:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN&gt;&lt;EM&gt;&lt;SPAN class="md-plain"&gt;NOTE: While this document demonstrates how to add to the&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppElementReference.cs&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN class="md-plain"&gt;&amp;nbsp;file I would suggest extending this outside of the core files as customizations will have to be merged with any updates from the framework.&lt;/SPAN&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Once the static class we want to use in our unit tests has been created we now need to add the XPath references to the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppElement&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;class. Below is an image showing the key value pair discussed in the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;AppElement&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;section above. The key correlates to the string value of the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;&lt;SPAN class="md-plain"&gt;AdfsLogin&lt;/SPAN&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;class while the value is the XPath directive for our elements.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;As shown in the image for Login_UserId we are searching the DOM for an input element with the id attribute of 'txtUserName'. XPath can be used to search for any attribute on the DOM element and can return a single value or multiple depending on what you're searching for.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Next Steps&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Custom Components and Web Resources&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;PowerApps Control Framework controls and web resources are customizations that represent great options to learn and extend the EasyRepro framework. Try locating the container for the PCF controls and HTML web resources and work towards creating custom objects representing the elements for each as described above.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Conclusion&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;In this article we discussed reasons why we will may need to extend the EasyRepro framework and some techniques in doing so. We explored working with Selenium objects and creating references to help us when creating unit tests. Finally we put this in an example for working with a ADFS Redirect page on login.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain md-expand"&gt;Thank you again for reading! Please let me know in the comments how your journey is going!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 11 Feb 2021 19:30:39 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-03-extending-the-easyrepro/ba-p/2043985</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-02-11T19:30:39Z</dc:date>
    </item>
    <item>
      <title>Collection of Useful Tools for Performance Test Engineers</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/collection-of-useful-tools-for-performance-test-engineers/ba-p/1884882</link>
      <description>&lt;P&gt;By Edwin Hernandez&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;We recently published an article with a collection of useful tools for QA/Test Engineers, highlighting tools that are sometimes overlooked or that you probably don't know about. If you get a chance please check that list too: &lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/collection-of-useful-tools-for-qa-test-engineers/ba-p/1734967" target="_blank" rel="noopener"&gt;Collections of Useful Tools for QA/Test Engineers&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;On the same lines, this time I'm writing this article geared towards Performance Test Engineers. Whenever you work with JMeter, Visual Studio, LoadRunner or any other IDE, these tools help in the areas of scripting, debugging, performance analysis, etc.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Parts of this list has been circulating inside of the Microsoft Test Team for years. An earlier version of this list was originally put together by Geoff Gray (100-level wizard of Testing if you ask me). Taking that list as starting point, I moved things around, updated old links, replaced with newer versions were applicable and added other tools I find useful and have used throughout the years. I hope you find this useful:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;TOOLS&lt;/H2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="149px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_1" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="149px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;PERFVIEW&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Performance-analysis tool that helps isolate CPU- and memory-related performance issues&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://github.com/microsoft/perfview" target="_blank" rel="noopener"&gt;https://github.com/microsoft/perfview&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="178px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_2" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="178px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;PAL:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Performance Analysis of Logs (PAL) Tool.&amp;nbsp; Reads in a performance monitor counter log and analyzes it using known thresholds.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://github.com/clinthuffman/PAL" target="_blank" rel="noopener"&gt;https://github.com/clinthuffman/PAL&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="150px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_3" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="150px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;SYSINTERNALS&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Manage, troubleshoot and diagnose your Windows systems and applications.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://docs.microsoft.com/en-us/sysinternals/" target="_blank" rel="noopener"&gt;https://docs.microsoft.com/en-us/sysinternals/&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="200px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_4" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="200px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;Windows Driver Kit (WDK)&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Develop, test, and deploy Windows drivers&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk" target="_blank" rel="noopener"&gt;https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="232px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_5" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="232px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;WINDBG&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Analyze crash/memory dumps.&lt;/LI&gt;
&lt;LI&gt;New preview version:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://www.microsoft.com/en-us/p/windbg-preview/9pgjgd53tn86?rtc=1&amp;amp;activetab=pivot:overviewtab" target="_blank" rel="noopener"&gt;https://www.microsoft.com/en-us/p/windbg-preview/9pgjgd53tn86?rtc=1&amp;amp;activetab=pivot:overviewtab&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Psscor4 Managed-Code Debugging Extension for WINDBG&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&amp;nbsp;&lt;A href="http://www.microsoft.com/en-us/download/details.aspx?id=21255" target="_blank" rel="noopener"&gt;http://www.microsoft.com/en-us/download/details.aspx?id=21255&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="151px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_6" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="151px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;DEBUG DIAG&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Debug Diagnostic Tool. Troubleshoot processes/threads, e.g. IIS.&lt;/LI&gt;
&lt;LI&gt;Version 2.3:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://www.microsoft.com/en-us/download/details.aspx?id=58210" target="_blank" rel="noopener"&gt;https://www.microsoft.com/en-us/download/details.aspx?id=58210&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="150px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_7" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="150px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;CLR PROFILER&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;CLRProfiler is a free tool from Microsoft to help you diagnose memory issues with your managed app.&lt;/LI&gt;
&lt;LI&gt;GitHub Repository:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://github.com/microsoftarchive/clrprofiler/" target="_blank" rel="noopener"&gt;https://github.com/microsoftarchive/clrprofiler/&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="150px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_8" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="150px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;FIDDLER&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Http traffic debugger, uses a proxy to look at communication coming in and out of a host.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://www.telerik.com/fiddler" target="_blank" rel="noopener"&gt;https://www.telerik.com/fiddler&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="96px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_9" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="96px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;WIRESHARK&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Packet analyzer for network traffic debugging&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://www.wireshark.org/download.html" target="_blank" rel="noopener"&gt;https://www.wireshark.org/download.html&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="150px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_10" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="150px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;LOG PARSER 2.2&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Command-line tools that provides query access to text-based data such as log files, XML files and CSV files&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://www.microsoft.com/en-us/download/details.aspx?id=24659" target="_blank" rel="noopener"&gt;https://www.microsoft.com/en-us/download/details.aspx?id=24659&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="123px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_11" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="123px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;LINQPAD&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Instantly test any LINQ,C#/F#/VB snippet or program&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://www.linqpad.net/" target="_blank" rel="noopener"&gt;https://www.linqpad.net/&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="150px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_12" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="150px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;ROY OSHEROVE's REGEXP TOOLS&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Regular Expression Syntax helper, visualizers, unit test tools, etc.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://osherove.com/tools" target="_blank" rel="noopener"&gt;https://osherove.com/tools&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="233px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_13" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="233px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;SERVICE TRACE VIEWER&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;WCF Service Trace Viewer tool helps you correlate diagnostic traces produced by WCF listeners to locate the root cause of an error&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://docs.microsoft.com/en-us/dotnet/framework/wcf/diagnostics/tracing/using-service-trace-viewer-for-viewing-correlated-traces-and-troubleshooting?redirectedfrom=MSDN" target="_blank" rel="noopener"&gt;https://docs.microsoft.com/en-us/dotnet/framework/wcf/diagnostics/tracing/using-service-trace-viewer-for-viewing-correlated-traces-and-troubleshooting?redirectedfrom=MSDN&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="260px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_14" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="260px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;Notepad++&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Powerful text editor, features applying different encoding options, language formatting, macros, external plugins and lets you perform many string manipulation operations&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://notepad-plus-plus.org/downloads/" target="_blank" rel="noopener"&gt;https://notepad-plus-plus.org/downloads/&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;**There are many others text editors such as &lt;A href="https://www.editpadpro.com/index.html" target="_blank" rel="noopener"&gt;EditPad Pro&lt;/A&gt;, PSPad, Charny Notepad, etc. but wanted to feature at least one.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="150px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_15" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="150px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;Beyond Compare&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Powerful comparison tool that allows you to compare two files or folders, merge changes and visualize everything using different viewers.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://www.scootersoftware.com/download.php" target="_blank" rel="noopener"&gt;https://www.scootersoftware.com/download.php&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="205px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_16" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="205px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;BareTail&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Log File Monitoring Tool that lets you trace a log file in real time and view the tail of the file as information keeps coming in, without blocking the file for writing. Also lets you highlight filter information by color.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://www.baremetalsoft.com/baretail/" target="_blank" rel="noopener"&gt;https://www.baremetalsoft.com/baretail/&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="123px"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_17" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="123px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;Telerik Code Converter&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Convert code from C# to VB and vice versa&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://converter.telerik.com/" target="_blank" rel="noopener"&gt;https://converter.telerik.com/&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="126.857px" height="205px"&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_18" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD width="596.571px" height="205px"&gt;
&lt;UL&gt;
&lt;UL&gt;
&lt;LI&gt;WebTest Power-Editor (Serializer)&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Power-Editor extension for Visual Studio WebTests (VS 2017). Allows you to modify multiple items inside a single Webtest or several WebTests and change values that are time-consuming to change one by one, such as Request properties, Transactions, etc.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://marketplace.visualstudio.com/items?itemName=EdwinHernandezMSFT.SerializerVSIX" target="_blank" rel="noopener"&gt;https://marketplace.visualstudio.com/items?itemName=EdwinHernandezMSFT.SerializerVSIX&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;GUIDES&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;GEOFF GRAY's QUICK REFERENCE GUIDE&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Visual Studio Performance Testing Quick Reference Guide (Version 3.6)&lt;/LI&gt;
&lt;LI&gt;All you need to know about troubleshooting Visual Studio Web/Load Tests&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://archive.codeplex.com/?p=vsptqrg" target="_blank" rel="noopener"&gt;https://archive.codeplex.com/?p=vsptqrg&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;LI&gt;Improving .NET Application Performance and Scalability&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Best practices guide&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/en-us/download/details.aspx?id=11711" target="_blank" rel="noopener"&gt;http://www.microsoft.com/en-us/download/details.aspx?id=11711&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;LI&gt;Biztalk Server Performance Optimization Guide:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Latest available is for Biztalk Server 2013&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://docs.microsoft.com/en-us/biztalk/technical-guides/biztalk-server-2013-performance-optimization-guide" target="_blank" rel="noopener"&gt;https://docs.microsoft.com/en-us/biztalk/technical-guides/biztalk-server-2013-performance-optimization-guide&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;BLOGS&lt;/H2&gt;
&lt;P&gt;Some of these may be a bit dated, but the fundamentals are still very valuable:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;NET Debugging for the Production Environment&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://channel9.msdn.com/Series/-NET-Debugging-Stater-Kit-for-the-Production-Environment" target="_blank" rel="noopener"&gt;http://channel9.msdn.com/Series/-NET-Debugging-Stater-Kit-for-the-Production-Environment&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Channel 9 Testing:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://channel9.msdn.com/search?term=testing" target="_blank" rel="noopener"&gt;http://channel9.msdn.com/search?term=testing&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;Mark Russinovich's Blog&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://docs.microsoft.com/en-us/archive/blogs/markrussinovich/" target="_blank" rel="noopener"&gt;https://docs.microsoft.com/en-us/archive/blogs/markrussinovich/&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Clint Huffman's Windows Performance Analysis Blog&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://docs.microsoft.com/en-us/archive/blogs/clinth/" target="_blank" rel="noopener"&gt;https://docs.microsoft.com/en-us/archive/blogs/clinth/&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;"If broken it is, fix it you should" blog&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://docs.microsoft.com/en-us/archive/blogs/tess/" target="_blank" rel="noopener"&gt;https://docs.microsoft.com/en-us/archive/blogs/tess/&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&amp;nbsp;&lt;/H2&gt;
&lt;H2&gt;OTHER LISTS OF TOOLS&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;Scott Hanselman’s Ultimate tool list:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.hanselman.com/blog/ScottHanselmans2011UltimateDeveloperAndPowerUsersToolListForWindows.aspx" target="_blank" rel="noopener"&gt;http://www.hanselman.com/blog/ScottHanselmans2011UltimateDeveloperAndPowerUsersToolListForWindows.aspx&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;SoftwareQaTest list of tools (very comprehensive):&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.softwareqatest.com/qatweb1.html?keepThis=true&amp;amp;TB_iframe=true&amp;amp;height=500&amp;amp;width=750" target="_blank" rel="noopener"&gt;http://www.softwareqatest.com/qatweb1.html?keepThis=true&amp;amp;TB_iframe=true&amp;amp;height=500&amp;amp;width=750 &lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;While this list includes mostly free tools, there are a few freeware or only trials. Also if you think I missed an important tool please let me know in the comments.&lt;/P&gt;</description>
      <pubDate>Thu, 11 Feb 2021 19:29:38 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/collection-of-useful-tools-for-performance-test-engineers/ba-p/1884882</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-02-11T19:29:38Z</dc:date>
    </item>
    <item>
      <title>Test Automation and EasyRepro: 02 - Designing and Debugging Unit Tests</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-02-designing-and-debugging-unit/ba-p/1853622</link>
      <description>&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;The following is the second on a series of articles by&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://www.linkedin.com/in/aliyoussefi/" target="_blank" rel="noopener nofollow noopener noreferrer"&gt;@Ali Youssefi&lt;/A&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;that we will be cross-posting into this Test Community Blog. These articles were first published by Ali in the Dynamics community but since the topic is very related with Testing it makes sense to publish here as well.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;If you didn't get a chance to catch the first one of the series, please have a look here:&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-01-overview-and-getting-started/ba-p/1617726" target="_blank" rel="noopener"&gt;Test Automation and EasyRepro: 01 - Overview and Getting Started&lt;/A&gt;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;Otherwise, please read ahead!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;-----------------------------------------------------------------------------------------------------------------&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1&gt;&lt;FONT color="#008080"&gt;&lt;STRONG&gt;&lt;SPAN&gt;Summary&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;U&gt;EasyRepro&lt;/U&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;is an&amp;nbsp;open source&amp;nbsp;framework built upon&amp;nbsp;&lt;U&gt;Selenium&lt;/U&gt;&amp;nbsp;allowing automated UI tests to be performed on a specific Dynamics 365 organization. This article will focus on designing and debugging unit tests. It will follow up on the first post's sample unit test in depth as well as provide design and troubleshooting ideas.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;FONT color="#008080"&gt;&lt;STRONG&gt;&lt;SPAN&gt;Getting Started&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;If you haven't already, you may want to clone the project that we used on the first article on this series (link above) from GitHub to DevOps then build locally and review any dependencies and/or test settings to run a simple test.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;FONT color="#008080"&gt;&lt;STRONG&gt;&lt;SPAN&gt;Reviewing the Open Account Sample Unit Test in depth&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;When working with the sample unit&amp;nbsp;tests&amp;nbsp;you'll soon find that while extremely helpful you'll need to modify or extend these tests to work with your customizations of the platform. The sample unit tests provide a great starting off point and can help us better understand how to work with the&amp;nbsp;EasyRepro&amp;nbsp;framework. Let's review the&amp;nbsp;&lt;STRONG&gt;UCITestOpenActiveAccount&lt;/STRONG&gt;&amp;nbsp;unit test line by line.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN&gt;WebClient&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;and&amp;nbsp;XrmApp&amp;nbsp;objects&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;The&amp;nbsp;&lt;STRONG&gt;WebClient&lt;/STRONG&gt;&amp;nbsp;is derived from the&amp;nbsp;&lt;STRONG&gt;BrowserPage&lt;/STRONG&gt;&amp;nbsp;class and injected into the&amp;nbsp;&lt;STRONG&gt;XrmApp&lt;/STRONG&gt;&amp;nbsp;object. The&amp;nbsp;&lt;STRONG&gt;WebClient&lt;/STRONG&gt;&amp;nbsp;contains mainly internal methods used by the&amp;nbsp;XrmApp&amp;nbsp;and platform element references such as&amp;nbsp;OnlineLogin, Navigation, Grid,&amp;nbsp;etc&amp;nbsp;as shown in the unit tests above.&amp;nbsp;Typically&amp;nbsp;you will not be interacting with this object until you need to extend the framework.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;The&amp;nbsp;&lt;STRONG&gt;XrmApp&lt;/STRONG&gt;&amp;nbsp;is the primary way of navigating and commanding the platform. When opened you'll see the&amp;nbsp;&lt;STRONG&gt;WebClient&lt;/STRONG&gt;&amp;nbsp;passed into each object used in the unit tests. Review this object to better understand each of the area of the platform you can work with in your unit tests.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;As you can see, each of the commands in the Open Account unit test are represented by elements related to Dynamics. These elements include commands related to the object such as working with entity forms and navigating around the platform. Each element can be explored to determine what functionality can be achieved from the framework natively.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN&gt;Commands&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;Let's review each one of the commands in the Open Account unit test to better understand what they are doing and where we may need to modify to better meet our requirements.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;SPAN&gt;Login&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;The&amp;nbsp;&lt;STRONG&gt;Login&lt;/STRONG&gt;&amp;nbsp;method typically involves two paths: One using the standard Microsoft Office login and one that redirects to your organization's sign in page.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;The first line shows passing in the URI of the organization, the username and password. How to set these values is covered in the first post in this series&amp;nbsp;&lt;U&gt;Test Automation and&amp;nbsp;EasyRepro: 01 - Overview and Getting Started.&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;The second shows how to incorporate your organization's sign in page. Each sign in page is unique and will require understanding how to work with Selenium and the DOM of the page to input and submit these credentials. This will be covered in the&amp;nbsp;&lt;STRONG&gt;Designing Tests towards Customization&lt;/STRONG&gt;&amp;nbsp;section.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;Once the&amp;nbsp;&lt;STRONG&gt;Login&lt;/STRONG&gt;&amp;nbsp;method has&amp;nbsp;completed&amp;nbsp;we will redirected to our default application in the organization. The next command details moving to another UCI application.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;SPAN&gt;Open UCI App&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;The&amp;nbsp;&lt;STRONG&gt;OpenApp&lt;/STRONG&gt;&amp;nbsp;method uses the&amp;nbsp;&lt;STRONG&gt;UCIAppName&lt;/STRONG&gt;&amp;nbsp;class to navigate to a specific UCI app. The standard platform applications such as Sales Hub and Customer Service Hub, as well as others, are available in the class. I'll cover how to extend to a custom UCI app in the&amp;nbsp;&lt;STRONG&gt;Designing Tests towards Customization&lt;/STRONG&gt;&amp;nbsp;section.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;SPAN&gt;Open Sub Area&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&lt;STRONG&gt;OpenSubArea&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;introduces the first navigation into the sitemap of the Unified Interface. This method expects two parameters, the first identifying which area to open and the second which subarea to click.&amp;nbsp;&lt;U&gt;These string values are case sensitive&lt;/U&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;SPAN&gt;Search&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;The Search method is used on the Grid object to search using the Quick Find view. Wildcard characters can be added here to simulate a user looking for values like or starting with specific characters if desired. For our unit test as long as we have the sample data in the&amp;nbsp;organization&amp;nbsp;we should pull up the Adventure Works (sample) record in the result set.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;SPAN&gt;Open Record&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;The final navigation command in the unit test is to open the first record in the Grid using&amp;nbsp;&lt;STRONG&gt;OpenRecord&lt;/STRONG&gt;.&amp;nbsp;As long as&amp;nbsp;we pulled up the Adventure Works (sample) in our results this will open the first record based on the index of the rows in the view. If the index is outside of the bounds an exception will be thrown.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;SPAN&gt;Think Time&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;Finally&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;we have reached the end of the unit test. The final command here is a method called&amp;nbsp;&lt;STRONG&gt;ThinkTime&lt;/STRONG&gt;. This is used to simulate a user waiting for&amp;nbsp;a period of time, in this case 3 seconds. This is a useful method to allow elements to render for use with the framework.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;FONT color="#008080"&gt;&lt;SPAN&gt;Designing Tests towards Customization&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;SPAN&gt;Adding custom UCI applications&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;In our sample unit test we are navigating to the Sales Hub Unified Interface but there maybe times where you will need to navigate to a specific custom application. A simple way to do so, assuming the UCI app shows in the user's drop down when logged in, is to add to the&amp;nbsp;UCIAppName&amp;nbsp;class.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;In the example above a new string has been added to the class called 'PfeCustomApp'. The&amp;nbsp;&lt;STRONG&gt;OpenApp&lt;/STRONG&gt;&amp;nbsp;method will search for an UCI app with called 'PFE Custom App'. This can then be used in single or many unit tests.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN&gt;Searching and reviewing results in a Grid&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;In our sample unit test we knew what to expect due to sample data in our organization.&amp;nbsp;However&amp;nbsp;when implementing your own unit tests you may want perform additional tasks like counting the number of results are returned, sort the records in the view, switch the view, etc.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;Above is an image from the Object Browser showcasing the native&amp;nbsp;EasyRepro&amp;nbsp;functionality for the Grid object. To&amp;nbsp;&lt;STRONG&gt;Search&lt;/STRONG&gt;&amp;nbsp;use the Search method. For reviewing results look to the&amp;nbsp;&lt;STRONG&gt;GetGridItems&lt;/STRONG&gt;&amp;nbsp;method to extract the grid items which we can iterate through.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN&gt;Changing Forms and Referencing Fields&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;Going back to the&amp;nbsp;&lt;STRONG&gt;UCITestOpenActiveAccount&lt;/STRONG&gt;&amp;nbsp;unit test as described above we searched for the Adventure Works (sample) record in clicked on the first record in the Quick Find view. We just touched on actions that can be performed on the view, now let's look at what can be done once we are inside the record.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;When the Adventure Works (sample) record is opened we now can shift gears to working with the Entity object. The Entity object includes functionality such as but not limited to:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;Assigning the record to another user or team&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;Working with field values&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;Working with Sub Grids&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;Switching Forms&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;Switching Processes&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;For&amp;nbsp;now&amp;nbsp;let's stick with changing forms and working with field values.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;SPAN&gt;Switching Forms&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;Start by navigating to the&amp;nbsp;&lt;STRONG&gt;OpenRecord&lt;/STRONG&gt;&amp;nbsp;method and adding a new line. Here we will add&amp;nbsp;&lt;STRONG&gt;SelectForm&lt;/STRONG&gt;("&amp;lt;name of your form&amp;gt;"). This works with the form selector and allows us to change the form based on the name.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;SPAN&gt;Working with Field Values&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;When working with most fields on the form the actions a user will perform are to clear out a value, read a value or update a value. In the below image I've added a line using the&amp;nbsp;&lt;STRONG&gt;GetValue&lt;/STRONG&gt;&amp;nbsp;method. This returns me the current value which can be used for validation or other concerns.&amp;nbsp;&lt;STRONG&gt;When referencing a&amp;nbsp;field&amp;nbsp;it is important to reference by its schema name and not display name&lt;/STRONG&gt;. For&amp;nbsp;instance&amp;nbsp;on Account instead of using 'Account Name' I'm using 'name'.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;To clear out a value you simply&amp;nbsp;have to&amp;nbsp;use&amp;nbsp;&lt;STRONG&gt;ClearValue&lt;/STRONG&gt;&amp;nbsp;and pass in the schema name.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;Finally&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;to set a value you use the&amp;nbsp;&lt;STRONG&gt;SetValue&lt;/STRONG&gt;&amp;nbsp;method passing in the schema name of the control (unless working with a complex type field).&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;FONT color="#008080"&gt;&lt;SPAN&gt;Debugging Tests&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;When you begin to extend and debug the sample unit tests towards your customization you may run questions regarding how the test is running, who its running as, how to handle unforeseen issues, etc. For this section we will talk through some common scenarios that come up and how to address them.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;&lt;SPAN&gt;My Unit Test is performing unexpected actions, what can I do?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN&gt;One of the key benefits of browser automation is that we can watch the unit test in action, halt the execution, and examine the current state of the platform. One of the first steps in doing this is to run the unit test in what's called&amp;nbsp;&lt;STRONG&gt;Non Headless&lt;/STRONG&gt;&lt;STRONG&gt;&amp;nbsp;Mode&lt;/STRONG&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN&gt;Running Unit Tests in&amp;nbsp;Non Headless&amp;nbsp;Mode&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;Headless Mode is what tells the unit test if we want to run the test with a GUI or not. Simply stated this will allow us to watch the browser launch and perform the actions or simply run in the background.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;In the first post in this&amp;nbsp;series&amp;nbsp;we touched on the&amp;nbsp;&lt;STRONG&gt;TestSettings&lt;/STRONG&gt;&amp;nbsp;object and how it tells our unit test how we want it to run. In this object is the class called&amp;nbsp;&lt;STRONG&gt;BrowserOptions&lt;/STRONG&gt;&amp;nbsp;and within this is a property called&amp;nbsp;&lt;STRONG&gt;Headless&lt;/STRONG&gt;. To turn headless mode on or off, set this value to true (on) or false (off).&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;&lt;SPAN&gt;My Unit Test needs to run as a specific user, what can I do?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN&gt;By&amp;nbsp;default&amp;nbsp;to run our&amp;nbsp;EasyRepro&amp;nbsp;unit tests (at least for the online platform) we must provide some credentials that determine who we run our tests as. This helps us identify and troubleshoot issues related to authentication and authorization. However sometimes due to your organization's setup you may have pass through authentication which will attempt to run the unit tests as the user you are logged into your machine with.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN&gt;Running Unit Tests in Incognito Mode&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;Going back to the&amp;nbsp;&lt;STRONG&gt;TestSettings&lt;/STRONG&gt;&amp;nbsp;object and inside of&amp;nbsp;&lt;STRONG&gt;BrowserOptions&lt;/STRONG&gt;&amp;nbsp;we find a property called&amp;nbsp;&lt;STRONG&gt;PrivateMode&lt;/STRONG&gt;. By setting this property to true we can run in "Incognito" or "InPrivate" or&amp;nbsp;whateevr&amp;nbsp;terminology your browser of choice uses. This helps us ensure we are using the credentials we provided as well as not assuming any cached settings are applied.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;&lt;SPAN&gt;My Unit Test needs to check form or grid values, what can I do?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN&gt;If you have worked with the Visual Studio Unit Testing tools in the past you are probably familiar with the&amp;nbsp;&lt;STRONG&gt;Assert&lt;/STRONG&gt;&amp;nbsp;class. This class allows a test designer to add assertions to ensure the actions performed are accurate.&amp;nbsp;EasyRepro&amp;nbsp;provides us the ability to check for form or grid values and elements which can then be used to with the Assert class.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN&gt;Using the Assert class&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;Below is an example of checking if the number of results from our search is not equal to a single result. This could be helpful to determine if duplicates exist as well as other scenarios.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;Reference:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;A href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.testtools.unittesting.assert?view=mstest-net-1.3.2" target="_self"&gt;&lt;SPAN&gt;&lt;U&gt;microsoft.visualstudio&lt;/U&gt;&lt;U&gt;.testtools.unittesting.assert&lt;/U&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;FONT color="#008080"&gt;&lt;SPAN&gt;Next Steps&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;STRONG&gt;&lt;SPAN&gt;Exploring the Sample Unit Tests&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN&gt;At this point you should have enough experience to begin exploring the other sample unit tests available in the&amp;nbsp;&lt;STRONG&gt;Microsoft.Dynamics365.UIAutomation.Sample&lt;/STRONG&gt;&amp;nbsp;project. These tests show how to interact with popular elements like Business Process Flows, Quick Create forms and Command Bar actions.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Each element has its own unique capabilities and should cover most of what you will need to automate testing in the platform.&amp;nbsp;However&amp;nbsp;you may come across a need to extend&amp;nbsp;EasyRepro&amp;nbsp;to account for specific use cases which we will cover in the next post in the series&amp;nbsp;&lt;STRONG&gt;Extending and Working with XPath.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;FONT color="#008080"&gt;&lt;SPAN&gt;Conclusion&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;This article focuses on a specific unit tests and exploring line by line what each command does. While this covers a significant amount of interaction with the&amp;nbsp;EasyRepro&amp;nbsp;framework it really is only one test case. Take time to review as many of the sample unit tests as possible. Some test I find beneficial are:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;UCITestCreateCase&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;SharedTestUploadTelemetry&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;UCITestBusinessProcessFlowNextStage&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;UCITestAccountAddNote&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;UCITestRetrieveCommandBarValues&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;·&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;UCITestUpdateClearFields&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="md-plain"&gt;-----------------------------------------------------------------------------------------------------------------&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;We hope you guys are enjoying this series of articles on EasyRepro, please don't hesitate&amp;nbsp;to leave any comments below!&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 11 Feb 2021 19:29:11 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-02-designing-and-debugging-unit/ba-p/1853622</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-02-11T19:29:11Z</dc:date>
    </item>
    <item>
      <title>How to Enable Undo &amp; Redo in JMeter</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/how-to-enable-undo-amp-redo-in-jmeter/ba-p/1788676</link>
      <description>&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;By Raman Pandey&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hello everyone, this time we bring you another JMeter post for those performance testers following this blog. JMeter is a very extensible and customizable tool, however sometimes it may need a few tweaks to make it look and behave the way you want on your specific OS and setup.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For example you can configure the log, enable and configure HiDPI (High Dots per inch) scaling, change the size of fonts, icons, toolbars, among many other things. This time around though, Raman will explain how to enable and configure Undo and Redo in JMeter and why it is not enabled by default:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 14.0pt; color: #2e75b5;"&gt;Undo &amp;amp; Redo in JMeter&lt;/H2&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Here is the solution for reverting back mistakes/changes while creating these massive JMeter scripts:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Undo and Redo are a very basic features of any editor or IDE. It is really annoying that such a basic feature is not found in JMeter. Here is the catch. JMeter has this feature but not by default and therefore we have to enable it from our end. JMeter team believes in making JMeter as light as possible and they are avoiding the extra memory consumption that would take place, therefore Undo and Redo options are kept hidden or disabled by default.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Initially, the JMeter toolbar without the Undo and Redo buttons looks like this:&lt;/P&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_15" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 14.0pt; color: #2e75b5;"&gt;Instructions:&lt;/H2&gt;
&lt;P&gt;Follow the below steps to enable these options:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Navigate to &lt;STRONG&gt;bin&lt;/STRONG&gt; folder of JMeter directory&lt;/LI&gt;
&lt;LI&gt;Open &lt;STRONG&gt;jmeter.properties&lt;/STRONG&gt; file using Notepad or Notepad++
&lt;OL&gt;
&lt;LI&gt;Side note here, you may prefer to make these changes in &lt;STRONG&gt;user.properties&lt;/STRONG&gt; which would only apply to your user but the values on this file supersede values on the other properties file. Also if you mess up, you can always reset with the content of jmeter.properties.&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;LI&gt;Search for &lt;STRONG&gt;undo.history.size&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Uncomment the line &lt;STRONG&gt;undo.history.size=0&lt;/STRONG&gt; by removing # (sharp sign)&lt;/LI&gt;
&lt;LI&gt;Set a natural number as a value of &lt;STRONG&gt;undo.history.size&lt;/STRONG&gt; attribute e.g. &lt;STRONG&gt;1, 5, 10, 50&lt;/STRONG&gt; etc. (This number represents the maximum number of steps that you can undo or redo.)&lt;/LI&gt;
&lt;LI&gt;Save the file and relaunch JMeter to reflect the changes.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_16" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;&lt;U&gt;Please note-&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;The number must be a natural number (1,2,3,….n) or simply say positive integer other than 0. The suggested value by JMeter is 25 which you can see in the description above this line in “jmeter.properties” file, it shows “Set it to a number &amp;gt; 0 (25 can be a good default)”. So, you can give 1 or 5 or 7 or 10 or 12 or 15 or 25, but not Zero. If you give Zero, there will not be any changes&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 14.0pt; color: #2e75b5;"&gt;Precaution:&lt;/H2&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;This number represents the maximum number of steps that you can undo or redo. You can set this to a larger number e.g. 50 or 100 but the &lt;STRONG&gt;&lt;EM&gt;bigger it is, the more it consumes memory&lt;/EM&gt;. &lt;/STRONG&gt;When you try to undo/redo more than 5-10 steps at a time then you will notice a big slowdown in JMeter. Hence, JMeter team suggest to have a maximum value of 25 and that too for a computer with very high RAM memory.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;For most of the normal users, 5 or 7 solve their purpose. Here, I have given the value as 5 which shown above.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Once you restart the JMeter you can see Undo and Redo options in the JMeter toolbar which are greyed-out; indicate no action done yet.&lt;/P&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_17" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Now, perform some actions in JMeter so that both the buttons get colorfully visible and clickable, as illustrated below&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_18" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;U&gt;Limitation: &lt;/U&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;Ctrl + Z or Command + Z (in Mac OS) does not work in JMeter. Only clicking the Undo/Redo button in the toolbar works.&lt;/EM&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;You can also do Undo/Redo from “Edit” option of JMeter or “Context Menu” by right-clicking on any of the Element as illustrated below:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&amp;nbsp;&lt;img /&gt;&lt;/P&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_19" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;That is it. Thanks Raman for sharing!&lt;/P&gt;
&lt;P&gt;Please leave any comments or questions below.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 11 Feb 2021 19:28:37 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/how-to-enable-undo-amp-redo-in-jmeter/ba-p/1788676</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-02-11T19:28:37Z</dc:date>
    </item>
    <item>
      <title>Collection of Useful Tools for QA/Test Engineers</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/collection-of-useful-tools-for-qa-test-engineers/ba-p/1734967</link>
      <description>&lt;DIV style="direction: ltr; border-width: 100%;"&gt;
&lt;DIV style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 8.5104in;"&gt;
&lt;DIV style="direction: ltr; margin-top: 0in; margin-left: 0in; width: 8.5104in;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Edited by&amp;nbsp; &lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="130536" data-lia-user-login="Edwin Hernandez" class="lia-mention lia-mention-user"&gt;Edwin Hernandez&lt;/a&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Please find below a collection of publicly available tools that I find valuable for QA/Test Engineers, either for Performance Testing or UI Test automation. These tools have been passed around internally on the MSFT Test Team, some of them for years. Most of them cover a tiny niche and thus can be considered a bit buried or obscure, but if they are what you need, they can help you.&lt;/P&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;"&gt;&amp;nbsp;&lt;/H2&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;"&gt;&amp;nbsp;&lt;/H2&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: #2e75b5;"&gt;BUILD QUALITY CHECKS&lt;/H2&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;(First reported by Bernhard Vogel)&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Using Azure DevOps "Build Quality Checks“ tasks, you can easily control that the quality steadily goes up from build to build. There are various smart metrics to use, i.e. compare test coverage of the previous build with the current build and if it trends down &amp;gt; fail the build.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-90px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_0" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-weight: bold; font-family: Calibri; font-size: 11.0pt;"&gt;Policies:&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="circle"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;The &lt;/SPAN&gt;&lt;SPAN style="font-style: italic; font-family: Calibri; font-size: 11.0pt;"&gt;Build Quality Checks&lt;/SPAN&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt; task currently supports two policies (click the link for details):&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;A href="https://github.com/MicrosoftPremier/VstsExtensions/blob/master/BuildQualityChecks/en-US/WarningsPolicy.md" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-weight: bold; font-family: Calibri; font-size: 11.0pt;"&gt;Warnings Policy&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt; - Allows you to fail builds based on the number of build warnings.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;A href="https://github.com/MicrosoftPremier/VstsExtensions/blob/master/BuildQualityChecks/en-US/CodeCoveragePolicy.md" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-weight: bold; font-family: Calibri; font-size: 11.0pt;"&gt;Code Coverage Policy&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt; - Allows you to fail builds based on the code coverage value of your tests.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Available here: &lt;A href="https://marketplace.visualstudio.com/items?itemName=mspremier.BuildQualityChecks#overview" target="_blank" rel="noopener"&gt;https://marketplace.visualstudio.com/items?itemName=mspremier.BuildQualityChecks#overview&lt;/A&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: #2e75b5;"&gt;SCREEN TO GIF&lt;/H2&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;(First reported by Johnathan Liu)&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;This tool allows you to record a selected area of your screen and save it as a Gif.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;I have to share out this very cool tool called ScreenToGif that was shown to me by a couple of TAMs in the UK. It allows you to record your actions on screen and turn them into awesome animated gifs. I could see this being incredibly useful for tutorials, repros, and demos.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: black;"&gt;You can share animated gifs on Twitter/Yammer and other social networks.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-90px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin-left: .375in; margin-top: 15pt; margin-bottom: 11pt; line-height: 23pt; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;SPAN style="font-weight: bold;"&gt;Features:&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV style="direction: ltr;"&gt;
&lt;TABLE style="direction: ltr; border-collapse: collapse; margin-left: .7083in; border: 1pt solid #A3A3A3;" title="" border="1" summary="" cellspacing="0" cellpadding="0"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: 2.9423in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;"&gt;
&lt;UL style="margin-left: .1583in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"&gt;
&lt;UL style="margin-left: .1583in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"&gt;
&lt;UL style="margin-left: 0in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt; color: #253340;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Record your screen and save directly to a gif looped animation. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL style="margin-left: 0in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Pause and continue to record. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Move the window around to record what you want. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;You can add Text, Subtitles, and Title Frames. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Edit the frames, add filters, revert, make yoyo style, change frame delay, add a border, add progress bars. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Export frames. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Crop and Resize. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;You can work even while the program is recording. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Remove frames that you don't want. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Select a folder to save the file automatically or select one before encoding. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P style="margin-top: 3pt; margin-bottom: 3pt; line-height: 17pt; font-family: Calibri; font-size: 11.0pt; color: #253340;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.6937in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;"&gt;
&lt;UL style="margin-left: .1583in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"&gt;
&lt;UL style="margin-left: 0in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Add the system cursor to your recording. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Very small-sized, portable, and multi-language executable. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Start/Pause and stop your recording using your F keys. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Multi-language: Portuguese, Spanish, Romanian, Russian, Swedish, Greek, French, Simplified Chinese, Italian, Vietnamese, and Tamil. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;GreenScreen unchanged pixels to save kilobytes. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;You can apply actions/filters to selected frames. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Fullscreen Recording. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Snapshot Mode. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 3pt; margin-bottom: 3pt; vertical-align: middle; line-height: 17pt;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #253340;"&gt;Drag and Drop to add frames in the editor. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;P style="margin: 0in; margin-left: .75in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Available here: &lt;A href="https://www.microsoft.com/en-us/p/screentogif/9n3sqk8pds8g?activetab=pivot:overviewtab#" target="_blank" rel="noopener"&gt;https://www.microsoft.com/en-us/p/screentogif/9n3sqk8pds8g?activetab=pivot:overviewtab#&lt;/A&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: #2e75b5;"&gt;BOT SERVICE STRESS TOOLKIT&lt;/H2&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;(First reported by Bernhard Vogel, a tool created by Daniel Amadei)&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle; color: #404040;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #404040;"&gt;Bot Service Stress Toolkit is based on &lt;/SPAN&gt;&lt;A href="https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fjmeter.apache.org%2F&amp;amp;data=02%7C01%7CBernhard.Vogel%40microsoft.com%7C4ba10a99df444844fce408d65cdfda41%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636798514000760291&amp;amp;sdata=tQKdyRZLyrYGofdUZi6vov2NiSvpA4tQtNUoRK9cpp4%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Apache JMeter&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #404040;"&gt; (which is an open-source stress-testing product provided by the Apache Software Foundation).&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle; color: #404040;"&gt;&lt;SPAN style="font-weight: bold; font-family: Calibri; font-size: 11.0pt; color: black;"&gt;Features&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt; color: #404040;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL style="margin-left: .75in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="circle"&gt;
&lt;LI lang="en-US" style="margin-top: 0pt; margin-bottom: 3pt; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #404040;"&gt;Leverages JMeter to make it easy and visual to perform stress tests on Bots. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0pt; margin-bottom: 3pt; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #404040;"&gt;Capable of not only making requests to the Bots but also receiving responses and correlating them back to the original requests, measuring the whole cycle.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0pt; margin-bottom: 3pt; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #404040;"&gt;Capable of asserting responses if needed, by leveraging native JMeter assertions.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0pt; margin-bottom: 3pt; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #404040;"&gt;Capable of loading test data from files or other data sources supported by JMeter. &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0pt; margin-bottom: 3pt; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #404040;"&gt;Capable of displaying test results in graphs, tables, and/or saving it to CSV files by leveraging native JMeter capabilities as well.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0pt; margin-bottom: 3pt; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #404040;"&gt;Measures throughput and latency of your Bot Service applications taking consideration of the whole cycle from the request to when the response is received.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0pt; margin-bottom: 3pt; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #404040;"&gt;Able to stress test bots built-in Bot Builder SDK v3 or v4.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0pt; margin-bottom: 3pt; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #404040;"&gt;Able to stress test bots running locally or in Azure Bot Service.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: #404040;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;SPAN style="color: #404040;"&gt;You can find more info along with the documentation on how to install, create &amp;amp; run tests here: &lt;/SPAN&gt;&lt;A href="https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fgithub.com%2Fdamadei%2FBotServiceStressToolkit&amp;amp;data=02%7C01%7CBernhard.Vogel%40microsoft.com%7C4ba10a99df444844fce408d65cdfda41%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636798514000770295&amp;amp;sdata=W0RBqMrdXW69i1mmdJiX0wtp9QWsqOUbF3WrsAU1YEc%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;http://github.com/damadei/BotServiceStressToolkit&lt;/A&gt;&lt;SPAN style="color: #404040;"&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: #2e75b5;"&gt;WINDOWS 10 MODERN TERMINAL&lt;/H2&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;(Reported by Edwin Hernandez)&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;New Modern Terminal was created by Microsoft as an &lt;/SPAN&gt;&lt;A href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fmicrosoft%2Fterminal&amp;amp;data=02%7C01%7Cedwinh%40microsoft.com%7C444ea96fcea1497b32b708d7eb3388bb%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637236478913033984&amp;amp;sdata=oUBe9sFDCa7WQ9VIJt%2F2hCY9Vx8phFp7wE4GYVlBfWc%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;open-source&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt; project. This Windows 10 app can have several types of shells as tabs on the same terminal window, even Unix shell.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;The project is still on preview but looks great so far:&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-90px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;Give it a try:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;A href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.microsoft.com%2Fstore%2FproductId%2F9N0DX20HK701&amp;amp;data=02%7C01%7Cedwinh%40microsoft.com%7C444ea96fcea1497b32b708d7eb3388bb%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637236478913033984&amp;amp;sdata=LFu%2Bv9J%2F4G7DWwg%2BP3zsL3yGFCnC3Qaa%2FM0Q%2FjQZakQ%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;https://www.microsoft.com/store/productId/9N0DX20HK701&lt;/A&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: #2e75b5;"&gt;AZURE DEVOPS DEMO GENERATOR&lt;/H2&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;(Reported by Darren Rich)&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Have you been looking for an example VisualStudio.com site that has:&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="circle"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #212529;"&gt;Docker-based Java web application along with build &amp;amp; release definitions, to deploy the application to the Docker containers in the Azure App Service (Linux) using VSTS&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #212529;"&gt;SonarQube template contains code of MyShuttle, a sample application that will be provisioned and customized to analyze the code during the build and improve code quality.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt; color: #212529;"&gt;Octopus template contains code for a sample PHP application which will be compiled using VSTS Build and deployed using Octopus Deploy on to an Azure App service.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Can you answer yes to any of the following questions?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="circle"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;I’m creating my own VSTS site to learn more about (Docker, AKS, GitHub CICD, Octopus, Selenium, Deployment Groups, WhiteSource-Bold)?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;I’m using the PartsUnlimited project to do XXX?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;Let me e-mail SmartPersonName and see if she can quickly create a demo VSTS site for the meeting?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px" style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;If you answered yes then you should check out the &lt;A href="https://azuredevopsdemogenerator.azurewebsites.net/" target="_blank" rel="noopener"&gt;Azure DevOps Demo Generator site&lt;/A&gt; and the corresponding docs page at &lt;A href="https://docs.microsoft.com/en-us/vsts/demo-gen/use-vsts-demo-generator-v2?view=vsts" target="_blank" rel="noopener"&gt;https://docs.microsoft.com/en-us/vsts/demo-gen/use-vsts-demo-generator-v2?view=vsts &lt;/A&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_3" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: #2e75b5;"&gt;UNIX EPOCH CONVERTER&lt;/H2&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;(Reported by Darren Rich)&lt;/P&gt;
&lt;UL style="margin-left: .375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;It is very common to come across query string parameters that have a HUGE number assigned to them.&amp;nbsp; You look around forever and do not find a solution.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang="en-US" style="margin-top: 0; margin-bottom: 0; vertical-align: middle; color: black;"&gt;&lt;SPAN style="font-family: Calibri; font-size: 11.0pt;"&gt;One VERY COMMON source of these seemingly odd numbers is a value referred to as Unix Time.&amp;nbsp; The next time you are trying to see if that number you are trying to parameterize is the Unix time you can find the current one at a very cool site.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="direction: ltr;"&gt;
&lt;TABLE style="direction: ltr; border-collapse: collapse; margin-left: .7083in; border: 1pt solid #A3A3A3;" title="" border="1" summary="" cellspacing="0" cellpadding="0"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="vertical-align: top; width: 2.6881in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;"&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_4" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/TD&gt;
&lt;TD style="vertical-align: top; width: 3.7819in; padding: 2.0pt 3.0pt 2.0pt 3.0pt; border: 1pt solid #A3A3A3;"&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt;" lang="en-US"&gt;&lt;A href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fcurrentmillis.com%2F&amp;amp;data=02%7C01%7Cedwinh%40microsoft.com%7Cbc19e2ce4e114cd163bc08d6b7c5505c%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636898455564616470&amp;amp;sdata=7%2BdxgixjibD1CHS4zMMN1bdMUqdTz8ysK%2BgAJlsndks%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;Current Millis ‐ Milliseconds since Unix Epoch&lt;/A&gt;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: #666666;" lang="en-US"&gt;Convert milliseconds to date - UNIX timestamp - UTC. Leap seconds: Leap seconds are one-second adjustments added to the UTC to synchronize it with solar time.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: #979797;" lang="en-US"&gt;currentmillis.com&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: #2e75b5;"&gt;DEBUGGING TOOLS&lt;/H2&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;(By Edwin Hernandez)&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;There are some tools used by developers and QA Engineers to do debugging of application, either on the front end or backend as well as the communications between them. These are not so obscure, these are known tools that you may already use, but just in case I wanted to include them on this list:&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;&lt;A href="https://www.wireshark.org/download.html" target="_blank" rel="noopener"&gt;Wireshark&lt;/A&gt;. Packet analyzer for network traffic debugging&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;&lt;A href="https://www.telerik.com/fiddler" target="_blank" rel="noopener"&gt;Fiddler&lt;/A&gt;. Http traffic debugger that uses a proxy to look at communication coming in and out of a host.&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;&lt;A href="https://github.com/clinthuffman/PAL" target="_blank" rel="noopener"&gt;Performance Analysis of Logs (PAL) Tool.&lt;/A&gt; The PAL tool reads in a performance monitor counter log and analyzes it using complex, but known thresholds.&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;&lt;A href="https://www.microsoft.com/en-us/download/details.aspx?id=58210" target="_blank" rel="noopener"&gt;DebugDiag&lt;/A&gt;. Assists in troubleshooting issues such as hangs, slow performance, memory leaks or memory fragmentation, and crashes in any user-mode process.&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;&lt;A href="https://github.com/microsoft/perfview" target="_blank" rel="noopener"&gt;&lt;SPAN style="text-decoration: underline;"&gt;PerfView&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="text-decoration: underline;"&gt;.&lt;/SPAN&gt; Performance-analysis tool that helps isolate CPU and memory-related performance issues. It is a Windows tool, but it also has some support for analyzing data collected on Linux machines. It works for a wide variety of scenarios but has several special features for investigating performance issues in code written for the .NET runtime.&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="margin: 0in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;And update on an old tool:&lt;/P&gt;
&lt;P style="margin: 0in; margin-left: .375in; font-family: Calibri; font-size: 11.0pt; color: black;" lang="en-US"&gt;&lt;A href="https://www.microsoft.com/en-us/p/windbg-preview/9pgjgd53tn86?rtc=1&amp;amp;activetab=pivot:overviewtab" target="_blank" rel="noopener"&gt;WinDbg Preview.&lt;/A&gt; Multipurpose debugger for Windows that can be used to debug kernel-mode and user-mode code, analyze crash dumps, and examine the CPU registers while the code executes. Microsoft just updated WinDbg to have more modern visuals, faster windows, a full-fledged scripting experience, and Time Travel Debugging. WinDbg Preview is using the same underlying engine as &lt;A href="https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugging-using-windbg-preview" target="_blank" rel="noopener"&gt;WinDbg&lt;/A&gt;, so all the commands, extensions, and workflows still work.&lt;/P&gt;
&lt;DIV id="tinyMceEditorMicrosoft_Testing_Team_5" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;</description>
      <pubDate>Thu, 11 Feb 2021 19:27:55 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/collection-of-useful-tools-for-qa-test-engineers/ba-p/1734967</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-02-11T19:27:55Z</dc:date>
    </item>
    <item>
      <title>How to use the Windows Certificate Store in JMeter</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/how-to-use-the-windows-certificate-store-in-jmeter/ba-p/1665786</link>
      <description>&lt;P lang="en-US"&gt;&lt;STRONG&gt;By&amp;nbsp;Chris Witte&lt;/STRONG&gt;&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P lang="en-US"&gt;The following article looks into an authentication problem that may appears when working with JMeter to create a HTTP script. JMeter is an Apache Software project mainly used for load testing (although it can also be used for other types of testing such as API tests).&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P lang="en-US"&gt;Microsoft published that Visual Studio Load Tests will be deprecated. VS2019 is the last version that has this feature. They have also mentioned JMeter has one of the preferred alternatives to cover this area (more on this &lt;A href="https://docs.microsoft.com/en-us/azure/devops/test/load-test/overview?view=azure-devops#alternatives" target="_blank" rel="noopener"&gt;here&lt;/A&gt;). JMeter is arguably the most popular load testing tool in the market and it's a free, open source and extensible, check our previous post on this &lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/what-are-the-best-performance-testing-tools/ba-p/367774" target="_blank" rel="noopener"&gt;here&lt;/A&gt;. You should check out if you are interested in migrating or starting a load test project.&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P lang="en-US"&gt;Now back to the problem:&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 lang="en-US"&gt;&lt;FONT color="#3366FF"&gt;Problem:&lt;/FONT&gt;&lt;/H2&gt;
&lt;P lang="en-US"&gt;As you may know, authentication is almost always the most difficult part of performance scripting. The application in question here had an API gateway (&lt;A href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.broadcom.com%2Fproducts%2Fsoftware%2Fapi-management&amp;amp;data=02%7C01%7Cedwinh%40microsoft.com%7C6a7c273582d243e8775308d83a144048%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637323205943965087&amp;amp;sdata=XFs426B4b4%2FEqidn6HI4bPp7vtMzo6IgUv3O2eUhoeU%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;Layer7&lt;/A&gt;) and in the process of migrating a Visual Studio Load Test to a JMeter Test Plan, we ran into issues providing a Client Certificate for authenticating with the API Gateway.&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P lang="en-US"&gt;The flow is:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Client sends a request with the certificate,&lt;/LI&gt;
&lt;LI&gt;A SAML token is returned,&lt;/LI&gt;
&lt;LI&gt;Client sends credentials along with the SAML token, and receives a L7 Session ID.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P lang="en-US"&gt;After retrieving that L7 Session ID, the user can make requests to the API. JMeter is good at maintaining those session cookies, however providing the initial client certificate was an issue.&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P lang="en-US"&gt;In JMeter you can specify a certificate store, so if you have a pk12 cert, this flow will not be an issue. In this case, the cert was in the Windows personal cert store, and the private key was marked as not exportable. Creating a Java cert store was out of the question.&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P lang="en-US"&gt;So, &lt;U&gt;how do we get JMeter to load and use the Windows certificate store? &lt;/U&gt;&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P lang="en-US"&gt;It’s quite simple, however there were no resources online that I could find to show this solution. We are providing it here to hopefully save everyone else time.&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 lang="en-US"&gt;&lt;FONT color="#3366FF"&gt;Answer:&lt;/FONT&gt;&lt;/H2&gt;
&lt;P lang="en-US"&gt;To get the windows certificate store available in JMeter launch with this command.&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P lang="en-US"&gt;The important values here are keyStore = NONE and keyStoreType = Windows-MY.&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE lang="en-US" style="margin: 0in; font-family: Calibri; font-size: 11.0pt;"&gt;&lt;SPAN style="color: blue; background: white;"&gt;jmeter &lt;/SPAN&gt;&lt;SPAN style="color: navy; background: white;"&gt;-Djavax&lt;/SPAN&gt;&lt;SPAN style="color: blueviolet; background: white;"&gt;.net.ssl.keyStore=NONE &lt;/SPAN&gt;&lt;SPAN style="color: navy; background: white;"&gt;-Djavax&lt;/SPAN&gt;&lt;SPAN style="color: blueviolet; background: white;"&gt;.net.ssl.keyStorePassword="" &lt;/SPAN&gt;&lt;SPAN style="color: navy; background: white;"&gt;-Djavax&lt;/SPAN&gt;&lt;SPAN style="color: blueviolet; background: white;"&gt;.net.ssl.keyStoreType="Windows-MY" --username &lt;/SPAN&gt;&lt;SPAN style="color: darkred; background: white;"&gt;"" &lt;/SPAN&gt;&lt;SPAN style="color: blueviolet; background: white;"&gt;--password&lt;/SPAN&gt;&lt;SPAN style="color: black; background: white;"&gt;&amp;nbsp; “”&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P lang="en-US"&gt;Then in JMeter you need to specify which cert to use:&lt;/P&gt;
&lt;OL type="1"&gt;
&lt;LI lang="en-US" value="1"&gt;Add a Keystore Configuration Element&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="lia-indent-padding-left-90px" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL type="1"&gt;
&lt;LI lang="en-US" value="2"&gt;Add a variable that will store the alias to the keystore configuration&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="lia-indent-padding-left-90px" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL type="1"&gt;
&lt;LI lang="en-US" value="3"&gt;Add the variable to the test. You can use a csv, or Redis data source. In our case we are using User Defined Variables. My cert’s alias is “chriswitte”&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="lia-indent-padding-left-90px" lang="en-US"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-90px" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL type="1"&gt;
&lt;LI lang="en-US" value="4"&gt;Now when you run your scripts it will add the client cert to your requests&lt;/LI&gt;
&lt;/OL&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P lang="en-US"&gt;I hope this does save time for someone else that may have this problem. If you have any comments or feedback feel free to leave it below. Thanks and until next time!&lt;/P&gt;
&lt;P lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 11 Feb 2021 19:27:33 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/how-to-use-the-windows-certificate-store-in-jmeter/ba-p/1665786</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-02-11T19:27:33Z</dc:date>
    </item>
    <item>
      <title>Test Automation and EasyRepro: 01 - Overview and Getting Started</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-01-overview-and-getting-started/ba-p/1617726</link>
      <description>&lt;P class="md-end-block md-heading"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;The following is the first on a series of articles by &lt;A href="https://www.linkedin.com/in/aliyoussefi/" target="_blank" rel="noopener"&gt;@Ali Youssefi&lt;/A&gt; that we will be cross-posting into this Test Community Blog. These articles were first published by Ali in the Dynamics community but since the topic is very related with Testing it makes sense to publish here as well.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;We will be interrelating cross-posting content with original articles and when it's a series. Stay tuned! &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&lt;SPAN class="md-plain"&gt;-----------------------------------------------------------------------------------------------------------------&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-heading"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;FONT color="#008080"&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Summary&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;EasyRepro is a framework that allow automated UI tests to be performed on a specific Dynamics 365 organization. You can use it to automate testing such as Smoke, Regression, Load, etc. The framework is built from the Open Source Selenium web drivers used by the industry across a wide range of projects and applications. The entire EasyRepro framework is Open Source and available on GitHub. The purpose of this article is to walk through the setup of the EasyRepro framework. It assumes you are familiar with concepts such as working with Unit Tests in Visual Studio, downloading NuGet packages and cloning repositories from GitHub.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;STRONG&gt;&lt;FONT color="#008080"&gt;&lt;SPAN class="md-plain"&gt;Getting Started&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;Now that you have a basic understanding of what EasyRepro is useful for you probably would like to start working with it. Getting EasyRepro up and running is very simple as the framework is designed with flexibility and agility in mind. However, like any other utility there is some initial learning and few hurdles to&lt;/SPAN&gt;&lt;SPAN class="md-softbreak"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;get over to begin working with EasyRepro. Let's start with dependencies!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Dependencies&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p md-focus lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain md-expand"&gt;The first dependency involves the EasyRepro assemblies and the Selenium framework. The second involve .NET, specifically the .NET framework (.NET core can be used and is included as a feature branch!). Finally depending on how you are working with the framework you will want to include a testing framework to design, build and run your unit tests.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p md-focus lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Choosing How to Consume the EasyRepro Framework&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;There are two ways of consuming the EasyRepro framework, one is using the NuGet packages directly while the other is to clone or download from the GitHub repository. The decision to use one over the other primarily depends on your need to explore or extend the framework and how you go about doing so. Working directly with the source code allows exploration into how EasyRepro interacts with Dynamics 365. However for extending the framework the approach of using the NuGet packages and building on top allows for increased flexibility.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Downloading using NuGet Package Manager&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;The quickest way to get started with the EasyRepro framework is to simply add a NuGet package reference to your unit test project. You can do by running this command in the NuGet Package Manager command line:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-150px"&gt;&lt;SPAN class="md-plain"&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-150px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Create your unit test project and navigate to the NuGet Package Manager CLI. Use the Install-Package command to get the PowerApps.UIAutomation.Api package as show in the command below (v9.0.2 is the latest as of this writing please refer to&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=" md-link"&gt;&lt;A href="https://www.nuget.org/packages/PowerApps.UIAutomation.Api/" target="_blank" rel="noopener"&gt;this link&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;for any updates:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE class="md-end-block md-p lia-indent-padding-left-90px"&gt;&lt;SPAN class="md-plain"&gt;Install-Package PowerApps.UIAutomation.Api -Version 9.0.2&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;This will get you the references needed to begin working with the framework immediately. Once installed you should the following packages begin to download into your unit test project:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-150px"&gt;&lt;SPAN class="md-plain"&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-150px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;When complete the required assemblies are available and you can begin working with the EasyRepro framework. There are some settings needed for the framework to connect to your Dynamics 365 organization which if you're new to the framework maybe unknown. If so I would suggest reviewing the next section which initiates a clone of the EasyRepro framework which happens to include a robust amount of sample unit tests that show how to interact with the framework.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Cloning from GitHub&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;If you're new to the framework in my opinion this is the best way to begin familiarizing yourself how it works and how to build a wide range of unit tests. This is also the way to go if you want to understand how EasyRepro is built upon the Selenium framework and how to extend.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;To begin go to the official EasyRepro project located at&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="md-link"&gt;&lt;A href="https://github.com/Microsoft/EasyRepro" target="_blank" rel="noopener"&gt;https://github.com/Microsoft/EasyRepro&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;. Once you're there take a moment to review the branches available. The branches are structured in a GitFlow approach so if you're wanting to work with the latest in market release of Dynamics 365 review the releases/* branches. For the latest on going development I would suggest the develop branch.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Start by cloning the project locally to review the contents and see how the interaction between the frameworks occurs.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;The gif below shows cloning to Azure DevOps but cloning locally directly from GitHub is also supported.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-150px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Cloning locally from Azure DevOps&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Another alternative which I highly recommend is to clone to an Azure DevOps project which can then be cloned locally. This will allow us to automate with CI/CD which we will cover in another article. If you decided to clone to Azure DevOps from GitHub the next step is to clone locally.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;The gif below shows cloning locally from an Azure DevOps repository.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-150px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;STRONG&gt;&lt;FONT color="#008080"&gt;&lt;SPAN class="md-plain"&gt;Reviewing the EasyRepro Source Code Projects&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The EasyRepro source code includes a Visual Studio solution with three class library projects and one for sample unit tests.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-150px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The projects used by the Unified Interface are Microsoft.Dynamics365.UIAutomation.Api.UCI and Microsoft.Dynamics365.UIAutomation.Api.Browser. Most of the usage between EasyRepro and unit tests will happen with objects and commands within the Microsoft.Dynamics365.UIAutomation.Api.UCI project. This project contains objects to interact with Dynamics Unified Interface modules and forms. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&lt;SPAN class="md-plain"&gt;The Microsoft.Dynamics365.UIAutomation.Api.Browser project is limited to interacts with the browser driver and other under the hood components.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;STRONG&gt;&lt;FONT color="#008080"&gt;&lt;SPAN class="md-plain"&gt;Reviewing Sample Unit Tests&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/H2&gt;
&lt;H3 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Looking into the Open Account Sample Unit Test&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;The unit test project&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Microsoft.Dynamics365.UIAutomation.Sample&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;contains hundreds of unit tests which can serve as a great learning tool to better understand how to work with the EasyRepro framework. I highly suggest exploring these tests when you begin to utilize the framework within your test strategy. Many general and specific tasks are essentially laid out and can be transformed to your needs. Examples include opening forms (&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;OpenRecord&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;), navigating (&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;OpenSubArea&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;) and searching for records (&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Search&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;), creating and updating records (&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Save&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;).&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;For this exercise we will open up the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;UCITestOpenActiveAccount&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;unit test, you can find this using Find within Visual Studio (Ctrl+F). Once found you should see something like the following:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-150px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Following the steps within the unit test you can see its designed to perform basic user actions to read an account. We start by logging into an organization (&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Login&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;). Then we proceed to open the UCI application titled "Sales" (&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;OpenApp&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;). Once in the organization we open the Accounts sub area (&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;OpenSubArea&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;) and search for "Adventure" in the Quick Find View (&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Search&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;). Finally we open the first record (&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;OpenRecord(0)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;) in the quick find view results.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Exploring Test Settings&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;In the current sample Unit Test project the test settings are set in two places: the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;app.config&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;file located in the root of the project and in the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;TestSettings.cs&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;file, a class object used across all of the tests.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Application Configuration file&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;The&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;app.config&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;file includes string configurations that tell the tests what organization to login to, who to login as and other under the hood settings like which browser to run and how to run the tests.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;Application Configuration File Settings&lt;/SPAN&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;FIGURE class="md-table-fig lia-indent-padding-left-30px"&gt;
&lt;TABLE class="md-table lia-indent-margin-left-30px" border="1"&gt;
&lt;THEAD class="lia-indent-padding-left-30px"&gt;
&lt;TR class="md-end-block lia-indent-padding-left-30px"&gt;
&lt;TH class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Property&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TH&gt;
&lt;TH class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;Description&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY class="lia-indent-padding-left-30px"&gt;
&lt;TR class="md-end-block lia-indent-padding-left-30px"&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;OnlineUsername&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;String. Used to represent the test user name.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR class="md-end-block lia-indent-padding-left-30px"&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;OnlinePassword&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;String. Used to represent the test user password.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR class="md-end-block lia-indent-padding-left-30px"&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;OnlineCrmUrl&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;String. Used to represent the organization (i.e. https://&lt;/SPAN&gt;&lt;SPAN class="md-tag md-raw-inline"&gt;&amp;lt;your org&amp;gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;.crm.dynamics.com/main.aspx)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR class="md-end-block lia-indent-padding-left-30px"&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;AzureKey&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;String. GUID representation of Azure Application Insights Instrumentation Key.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR class="md-end-block lia-indent-padding-left-30px"&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;BrowserType&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;String. Represents enum flag for Microsoft.Dynamics365.UIAutomation.Browser.BrowserType.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR class="md-end-block lia-indent-padding-left-30px"&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;RemoteBrowserType&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;String. Represents enum flag for Microsoft.Dynamics365.UIAutomation.Browser.BrowserType. Only used if BrowserType is Remote.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR class="md-end-block lia-indent-padding-left-30px"&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;RemoteHubServer&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;TD class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="td-span"&gt;&lt;SPAN class="md-plain"&gt;String. Represents Selenium Server remote hub URL. Only used if BrowserType is Remote.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;/FIGURE&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;For this article we will focus on simply running locally with the Google Chrome browser by setting the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;BrowserType&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;to "Chrome". Also inside of the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;app.config&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;file are three settings we need to modify called&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;OnlineUsername&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;,&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;OnlinePassword&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;OnlineCrmUrl&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;. In my case I am using a trial and as you can see below I am using a "&lt;/SPAN&gt;&lt;SPAN class="md-link"&gt;&lt;A href="mailto:user@tenant.onmicrosoft.com" target="_blank" rel="noopener"&gt;user@tenant.onmicrosoft.com&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;" username and a "https://&lt;/SPAN&gt;&lt;SPAN class="md-tag md-raw-inline"&gt;&amp;lt;orgname&amp;gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;.crm.dynamics.com/main.aspx" URL.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN&gt;&lt;U&gt;&lt;SPAN class="md-plain"&gt;Before:&lt;/SPAN&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;U&gt;&lt;SPAN class="md-plain"&gt;After:&lt;/SPAN&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Test Settings and the BrowserOptions object&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Another key object is the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;TestSettings&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;class and the various properties inside. This class tells the unit tests how to render the browser, where the browser driver can be located as well as other properties. The&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;TestSettings&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;class will need to be included in the Unit Test project and instantiate the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="md-plain"&gt;BrowserOptions&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="md-plain"&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;object as shown below:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;In the next post we will explore how these settings can change your experience working with unit tests and what options are available.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="md-end-block md-p"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="md-end-block md-heading"&gt;&lt;STRONG&gt;&lt;FONT color="#008080"&gt;&lt;SPAN class="md-plain"&gt;Next Steps&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/H2&gt;
&lt;H3 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3 class="md-end-block md-heading lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain"&gt;Conclusion&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class="md-end-block md-p lia-indent-padding-left-30px"&gt;&lt;SPAN class="md-plain md-expand"&gt;From this article you should be able to begin using EasyRepro with your Dynamics 365 organization immediately. The next articles will go into designing and debugging unit tests, extending the EasyRepro code, implementing with Azure DevOps and other topics.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 11 Feb 2021 19:26:37 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/test-automation-and-easyrepro-01-overview-and-getting-started/ba-p/1617726</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-02-11T19:26:37Z</dc:date>
    </item>
    <item>
      <title>Advanced Logger for UI Test Automation using Azure DevOps</title>
      <link>https://techcommunity.microsoft.com/t5/testingspot-blog/advanced-logger-for-ui-test-automation-using-azure-devops/ba-p/1579436</link>
      <description>&lt;P&gt;by&amp;nbsp;&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="130536" data-lia-user-login="Edwin Hernandez" class="lia-mention lia-mention-user"&gt;Edwin Hernandez&lt;/a&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In this article, I will describe the implementation of a logger for UI Test automation and the integration with test execution from an Azure DevOps Release pipeline. This article and the demo solution are standalone articles; however, I do build on concepts we reviewed on previous articles, specifically:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/ui-automation-page-object-model-and-other-design-patterns/ba-p/992242" target="_blank" rel="noopener"&gt;UI Automation - Page Object Model and other Design Patterns&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/t5/testingspot-blog/winappdriver-and-desktop-ui-test-automation/ba-p/1124543" target="_blank" rel="noopener"&gt;WinAppDriver and Desktop UI Test Automation&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You may want to read through those articles before starting with this one. Having said that, let us get started describing what the logger does.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#3366FF"&gt;&lt;STRONG&gt;Purpose&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;UI Test automation and Regression are time-consuming expensive tasks because of their initial time investment and their maintenance effort. Even if a test suite is well maintained, once Automated Regression is executed, you still need a QA Automation Engineer to analyze the results and investigate any errors.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The purpose of this logger is to provide a detailed log of the flow of the UI script, including test case steps and screenshots. The QA Engineer or a Business Analyst can use the information from the logger to follow the business logic of the UI test and more easily validate if the intended work was completed or the reason for failure if an error occurred. A descriptive log can be more useful than even an actual video recording of the test.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#3366FF"&gt;&lt;STRONG&gt;Logger Features&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;The logger creates a single HTML file that contains all messages and embedded images.&lt;/LI&gt;
&lt;LI&gt;This class is meant to be used in a Page Object Model project, when the LogMessage method is called it reflects itself to get the calling method and class and it uses this information to write a message into the HTML log.&lt;/LI&gt;
&lt;LI&gt;There are 4 log levels to help filtering how much information you want to log (error, warning, passed, info). This and other configurations are exposed as global variables. You can also specify the level up to which you want screenshots to be taken.&lt;/LI&gt;
&lt;LI&gt;Screenshots are saved as binary strings and embed into the HTML file so that you end up with a single file. This greatly helps the integration with Azure DevOps.&lt;/LI&gt;
&lt;LI&gt;This logger is adaptable since it is a standalone class. You can plug it into several types of UI Test projects. I have personally used it with WinAppDriver, CodedUI, Selenium WebDriver, and Xamarin.UITests projects with minimal changes, pretty much all that needs to be changed is the type of session object that is passed as an argument and the screenshot method.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#3366FF"&gt;&lt;STRONG&gt;Logger Requirements&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Given the frameworks I just mentioned, you can guess that this Logger class was written in C# and is meant to be used on Visual Studio for UI Test projects running over MSTest or NUnit projects. You could adapt it to other types of frameworks, but it would require more work.&lt;/LI&gt;
&lt;LI&gt;As I said this logger is meant to be used as part of a Page Object Model (POM), it is not that you couldn't use it with a straight Top to Bottom test but you would take more advantage of it in a POM project.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Other than that, the log method needs to be specifically called every time something needs to be logged. I explored the option of using the constructor or interfaces, but it would require the class to be more coupled with the test solution and I wanted it to be more portable.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#3366FF"&gt;&lt;STRONG&gt;Configuration Variables&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;The logger configuration variables should be put for example on the Class Initialize method:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A log level of 4 would log all messages, a log level of 3 would log only messages level 1 to 3. You can change the labels of the labels in the &lt;STRONG&gt;HTMLLogFile&lt;/STRONG&gt; class itself.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#3366FF"&gt;&lt;STRONG&gt;Logging Messages from the Test Method&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;As I mentioned earlier, the &lt;STRONG&gt;LogMessage&lt;/STRONG&gt; method needs to be called every time something is to be logged into the file. I recommend that only "Info" level messages should be logged from the Test Method, mostly to log comments and business step details that would make the HTML report easier to read, for example:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The &lt;STRONG&gt;InsertDividerForNewTest&lt;/STRONG&gt; creates a header for the report, then every "Info" step is logged with or without screenshots depending on the configured level.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#3366FF"&gt;&lt;STRONG&gt;Logging Messages from the Page Class Methods&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;This may be the most interesting part, every time you use &lt;STRONG&gt;LogMessage&lt;/STRONG&gt; from the Page Class Methods, the &lt;STRONG&gt;HTMLLogFile&lt;/STRONG&gt; class will use reflection to get the calling method/class information and it will include this information into the HTML report, take the following for example:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;By including &lt;STRONG&gt;LogMessage&lt;/STRONG&gt; "Passed" at the end, the HTML log will print the following:&lt;/P&gt;
&lt;P&gt;Thus, by having well-constructed Page Object Classes, the log would build itself with very few additional comments.&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;&lt;img /&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#3366FF"&gt;&lt;STRONG&gt;Finding the Log for Local Test Executions&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;To have this HTML file to be uploaded to Azure DevOps it must be part of the Test Context. This part is included in this demo in the Class Cleanup Method:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If the UI test is executed from Visual Studio (make sure you have WinAppDriver installed, please check my other post about this on the top). The Test Detail Summary should show additional output already part of the Test Context, and inside of that you can see the HTML file:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;If you open that, the HTML log should have a header, then every Log Message. Please note that screenshots are &lt;U&gt;expandable on hover.&lt;/U&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&lt;FONT color="#3366FF"&gt;&lt;STRONG&gt;Integration with Azure DevOps Release Pipeline&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;Now for the next part, I will only show what the result would look like. Setting up a Release Pipeline in Azure DevOps for UI Test Regression &lt;U&gt;is not in the scope&lt;/U&gt; of this article. I intend to cover that in a future article, there are several ways to accomplish that depending on what you need to do.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For now, the screenshot below is a simple Release Pipeline that takes the Test Assemblies as an artifact, executes the Tests on a Private (Self-Hosted) Build Agent set on interactive mode.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;MSTest automatically uploads to the Release Pipeline test results information (# of test passed, pass %, duration, etc.) and if you expand a specific test and navigate to the &lt;U&gt;Attachments panel&lt;/U&gt;, the HTML Log file should be there already associated with that test. Every test will get a unique HTML file:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The benefits of running Regression from a Release Pipeline are related to traceability against a Build/Environment and even user stories and test cases. For deployment approval and for historical purposes since tests are saved into the cloud instead of local files.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;FONT color="#3366FF"&gt;&lt;STRONG&gt;Download Demo Project and HTMLLogFIle class&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H3&gt;
&lt;P&gt;You can find at the bottom of this post, a file containing a Visual Studio solution that has a demo POM library project, a test project, and the &lt;STRONG&gt;HTMLLogFIle&lt;/STRONG&gt; class, as well as a demo HTML report file as a reference.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you have any comments/concerns, please reach out or comment below.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 11 Feb 2021 19:26:09 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/testingspot-blog/advanced-logger-for-ui-test-automation-using-azure-devops/ba-p/1579436</guid>
      <dc:creator>Microsoft_Testing_Team</dc:creator>
      <dc:date>2021-02-11T19:26:09Z</dc:date>
    </item>
  </channel>
</rss>

