From 7ab16e656bf96f11493faf8c406eb84dfd3c2e92 Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Fri, 17 Jan 2025 19:00:27 +0100 Subject: [PATCH 1/5] Document MSTEST0039 and MSTEST0040 --- .../testing/mstest-analyzers/mstest0035.md | 2 +- .../testing/mstest-analyzers/mstest0036.md | 2 +- .../testing/mstest-analyzers/mstest0037.md | 2 +- .../testing/mstest-analyzers/mstest0038.md | 2 +- .../testing/mstest-analyzers/mstest0039.md | 41 +++++++++++++++++++ .../testing/mstest-analyzers/mstest0040.md | 41 +++++++++++++++++++ .../testing/mstest-analyzers/usage-rules.md | 2 + docs/navigate/devops-testing/toc.yml | 4 ++ 8 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 docs/core/testing/mstest-analyzers/mstest0039.md create mode 100644 docs/core/testing/mstest-analyzers/mstest0040.md diff --git a/docs/core/testing/mstest-analyzers/mstest0035.md b/docs/core/testing/mstest-analyzers/mstest0035.md index fc88e19ba0524..a303fc9ecbcdd 100644 --- a/docs/core/testing/mstest-analyzers/mstest0035.md +++ b/docs/core/testing/mstest-analyzers/mstest0035.md @@ -1,5 +1,5 @@ --- -title: "[DeploymentItem] can be specified only on test class or test method." +title: "MSTEST0035: [DeploymentItem] can be specified only on test class or test method." description: "Learn about code analysis rule MSTEST0035: `[DeploymentItem]` can be specified only on test class or test method." ms.date: 08/02/2024 f1_keywords: diff --git a/docs/core/testing/mstest-analyzers/mstest0036.md b/docs/core/testing/mstest-analyzers/mstest0036.md index e0a055466bc7e..8cc9d38a866b2 100644 --- a/docs/core/testing/mstest-analyzers/mstest0036.md +++ b/docs/core/testing/mstest-analyzers/mstest0036.md @@ -1,5 +1,5 @@ --- -title: "Do not use shadowing inside test class." +title: "MSTEST0036: Do not use shadowing inside test class." description: "Learn about code analysis rule MSTEST0036: Do not use shadowing inside test class." ms.date: 08/19/2024 f1_keywords: diff --git a/docs/core/testing/mstest-analyzers/mstest0037.md b/docs/core/testing/mstest-analyzers/mstest0037.md index 6c37be8bc677e..06e9e9e3f9441 100644 --- a/docs/core/testing/mstest-analyzers/mstest0037.md +++ b/docs/core/testing/mstest-analyzers/mstest0037.md @@ -1,5 +1,5 @@ --- -title: "Use proper 'Assert' methods" +title: "MSTEST0037: Use proper 'Assert' methods" description: "Learn about code analysis rule MSTEST0037: Use proper 'Assert' methods." ms.date: 11/17/2024 f1_keywords: diff --git a/docs/core/testing/mstest-analyzers/mstest0038.md b/docs/core/testing/mstest-analyzers/mstest0038.md index 09423518792da..d0f0e5b6c06bc 100644 --- a/docs/core/testing/mstest-analyzers/mstest0038.md +++ b/docs/core/testing/mstest-analyzers/mstest0038.md @@ -1,5 +1,5 @@ --- -title: "Don't use 'Assert.AreSame' or 'Assert.AreNotSame' with value types" +title: "MSTEST0038: Don't use 'Assert.AreSame' or 'Assert.AreNotSame' with value types" description: "Learn about code analysis rule MSTEST0038: Don't use 'Assert.AreSame' or 'Assert.AreNotSame' with value types" ms.date: 01/06/2025 f1_keywords: diff --git a/docs/core/testing/mstest-analyzers/mstest0039.md b/docs/core/testing/mstest-analyzers/mstest0039.md new file mode 100644 index 0000000000000..6b807c84b1944 --- /dev/null +++ b/docs/core/testing/mstest-analyzers/mstest0039.md @@ -0,0 +1,41 @@ +--- +title: "MSTEST0039: Use newer 'Assert.Throws' methods" +description: "Learn about code analysis rule MSTEST0039: Use 'Assert.ThrowsExactly' instead of 'Assert.ThrowsException'" +ms.date: 01/17/2025 +f1_keywords: +- MSTEST0039 +- UseNewerAssertThrowsAnalyzer +helpviewer_keywords: +- UseNewerAssertThrowsAnalyzer +- MSTEST0039 +author: Youssef1313 +ms.author: ygerges +--- +# MSTEST0039: Use newer 'Assert.Throws' methods + +| Property | Value | +|-------------------------------------|------------------------------------------------------------------------| +| **Rule ID** | MSTEST0039 | +| **Title** | Use newer 'Assert.Throws' methods | +| **Category** | Usage | +| **Fix is breaking or non-breaking** | Non-breaking | +| **Enabled by default** | Yes | +| **Default severity** | Info | +| **Introduced in version** | 3.8.0 | +| **Is there a code fix** | Yes | + +## Cause + +The use of or which are no longer recommended. + +## Rule description + + and are not recommended and may be deprecated in the future. + +## How to fix violations + +Instead, use `Assert.ThrowsExactly` or `Assert.ThrowsExactlyAsync` instead of `Assert.ThrowsException` or `Assert.ThrowsExceptionAsync`. + +## When to suppress warnings + +Do not suppress a warning from this rule. It's strongly recommended to move from the old APIs to the new ones. diff --git a/docs/core/testing/mstest-analyzers/mstest0040.md b/docs/core/testing/mstest-analyzers/mstest0040.md new file mode 100644 index 0000000000000..42facad456b1a --- /dev/null +++ b/docs/core/testing/mstest-analyzers/mstest0040.md @@ -0,0 +1,41 @@ +--- +title: "MSTEST0040: Do not assert inside 'async void' contexts" +description: "Learn about code analysis rule MSTEST0040: Do not assert inside 'async void' methods, local functions, or lambdas because they may not fail the test" +ms.date: 01/17/2025 +f1_keywords: +- MSTEST0040 +- AvoidUsingAssertsInAsyncVoidContextAnalyzer +helpviewer_keywords: +- AvoidUsingAssertsInAsyncVoidContextAnalyzer +- MSTEST0040 +author: Youssef1313 +ms.author: ygerges +--- +# MSTEST0040: Do not assert inside 'async void' contexts + +| Property | Value | +|-------------------------------------|------------------------------------------------------------------------| +| **Rule ID** | MSTEST0040 | +| **Title** | Do not assert inside 'async void' contexts | +| **Category** | Usage | +| **Fix is breaking or non-breaking** | Non-breaking | +| **Enabled by default** | Yes | +| **Default severity** | Warning | +| **Introduced in version** | 3.8.0 | +| **Is there a code fix** | No | + +## Cause + +The use of any assertion method in an `async void` method, local function, or lambda. + +## Rule description + +Exceptions that are thrown in an `async void` context are unobserved. So, a failing assertion in an `async void` method may go unnoticed. When using VSTest, such exceptions are very likely to be unnoticed. When using Microsoft.Testing.Platform, such exception *may* crash the process + +## How to fix violations + +Refactor the code to not use assertions in `async void`. + +## When to suppress warnings + +Do not suppress a warning from this rule. \ No newline at end of file diff --git a/docs/core/testing/mstest-analyzers/usage-rules.md b/docs/core/testing/mstest-analyzers/usage-rules.md index cbd2bdfa23b9a..8df56f13079bb 100644 --- a/docs/core/testing/mstest-analyzers/usage-rules.md +++ b/docs/core/testing/mstest-analyzers/usage-rules.md @@ -35,3 +35,5 @@ Identifier | Name | Description [MSTEST0035](mstest0035.md) | UseDeploymentItemWithTestMethodOrTestClassTitle | `[DeploymentItem]` can be specified only on test class or test method [MSTEST0037](mstest0037.md) | UseProperAssertMethodsAnalyzer | Use proper `Assert` methods [MSTEST0038](mstest0038.md) | AvoidAssertAreSameWithValueTypesAnalyzer | Don't use `Assert.AreSame` or `Assert.AreNotSame` with value types +[MSTEST0039](mstest0039.md) | UseNewerAssertThrowsAnalyzer | Use newer 'Assert.Throws' methods +[MSTEST0040](mstest0040.md) | AvoidUsingAssertsInAsyncVoidContextAnalyzer | Do not assert inside 'async void' contexts diff --git a/docs/navigate/devops-testing/toc.yml b/docs/navigate/devops-testing/toc.yml index 4a64586b2510c..53dc1493cd805 100644 --- a/docs/navigate/devops-testing/toc.yml +++ b/docs/navigate/devops-testing/toc.yml @@ -193,6 +193,10 @@ items: href: ../../core/testing/mstest-analyzers/mstest0037.md - name: MSTEST0038 href: ../../core/testing/mstest-analyzers/mstest0038.md + - name: MSTEST0039 + href: ../../core/testing/mstest-analyzers/mstest0039.md + - name: MSTEST0040 + href: ../../core/testing/mstest-analyzers/mstest0040.md - name: Microsoft Testing Platform items: - name: Overview From 0a3903537e5a8a52a984979bd650874d85c2136d Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Fri, 17 Jan 2025 19:07:10 +0100 Subject: [PATCH 2/5] Fix markdownlint violation --- docs/core/testing/mstest-analyzers/mstest0040.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/core/testing/mstest-analyzers/mstest0040.md b/docs/core/testing/mstest-analyzers/mstest0040.md index 42facad456b1a..0ffd59f2adb38 100644 --- a/docs/core/testing/mstest-analyzers/mstest0040.md +++ b/docs/core/testing/mstest-analyzers/mstest0040.md @@ -38,4 +38,4 @@ Refactor the code to not use assertions in `async void`. ## When to suppress warnings -Do not suppress a warning from this rule. \ No newline at end of file +Do not suppress a warning from this rule. From 4177e9e473b32b96f1f4718ab2e1a7d0f8c76e9f Mon Sep 17 00:00:00 2001 From: Youssef Victor Date: Fri, 17 Jan 2025 23:04:08 +0100 Subject: [PATCH 3/5] Reword --- docs/core/testing/mstest-analyzers/mstest0040.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/core/testing/mstest-analyzers/mstest0040.md b/docs/core/testing/mstest-analyzers/mstest0040.md index 0ffd59f2adb38..306ff8d0a9a40 100644 --- a/docs/core/testing/mstest-analyzers/mstest0040.md +++ b/docs/core/testing/mstest-analyzers/mstest0040.md @@ -30,7 +30,7 @@ The use of any assertion method in an `async void` method, local function, or la ## Rule description -Exceptions that are thrown in an `async void` context are unobserved. So, a failing assertion in an `async void` method may go unnoticed. When using VSTest, such exceptions are very likely to be unnoticed. When using Microsoft.Testing.Platform, such exception *may* crash the process +Exceptions that are thrown in an `async void` context are unhandled. A failing assertion in an `async void` method will be swallowed and will not crash the process when using VSTest under .NET Framework, and may crash the process when using Microsoft.Testing.Platform or VSTest under modern .NET. ## How to fix violations From aa55a06dce5c330ed93b4ef4ef94d24af906ab63 Mon Sep 17 00:00:00 2001 From: Youssef Victor Date: Tue, 21 Jan 2025 05:17:21 +0100 Subject: [PATCH 4/5] Update further --- docs/core/testing/mstest-analyzers/mstest0040.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/core/testing/mstest-analyzers/mstest0040.md b/docs/core/testing/mstest-analyzers/mstest0040.md index 306ff8d0a9a40..eccdebe68e1b7 100644 --- a/docs/core/testing/mstest-analyzers/mstest0040.md +++ b/docs/core/testing/mstest-analyzers/mstest0040.md @@ -30,7 +30,7 @@ The use of any assertion method in an `async void` method, local function, or la ## Rule description -Exceptions that are thrown in an `async void` context are unhandled. A failing assertion in an `async void` method will be swallowed and will not crash the process when using VSTest under .NET Framework, and may crash the process when using Microsoft.Testing.Platform or VSTest under modern .NET. +Exceptions that are thrown in an `async void` context are unhandled. A failing assertion in an `async void` method will be swallowed and will not crash the process when using VSTest under .NET Framework, and may crash the process when using Microsoft.Testing.Platform or VSTest under modern .NET, or even be silently swallowed in cases where a custom `SynchronizationContext` is present that catches the exception. ## How to fix violations From 7d5a3218ab15e16b855129447458dce4d09c1f54 Mon Sep 17 00:00:00 2001 From: Youssef Victor Date: Wed, 22 Jan 2025 18:51:53 +0100 Subject: [PATCH 5/5] Apply suggestions from code review Co-authored-by: Genevieve Warren <24882762+gewarren@users.noreply.github.com> --- docs/core/testing/mstest-analyzers/mstest0039.md | 6 +++--- docs/core/testing/mstest-analyzers/mstest0040.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/core/testing/mstest-analyzers/mstest0039.md b/docs/core/testing/mstest-analyzers/mstest0039.md index 6b807c84b1944..e6f63c5d5762f 100644 --- a/docs/core/testing/mstest-analyzers/mstest0039.md +++ b/docs/core/testing/mstest-analyzers/mstest0039.md @@ -26,15 +26,15 @@ ms.author: ygerges ## Cause -The use of or which are no longer recommended. +The use of or , which are no longer recommended. ## Rule description - and are not recommended and may be deprecated in the future. + and are not recommended and might be deprecated in the future. ## How to fix violations -Instead, use `Assert.ThrowsExactly` or `Assert.ThrowsExactlyAsync` instead of `Assert.ThrowsException` or `Assert.ThrowsExceptionAsync`. +Use `Assert.ThrowsExactly` or `Assert.ThrowsExactlyAsync` instead of `Assert.ThrowsException` or `Assert.ThrowsExceptionAsync`. ## When to suppress warnings diff --git a/docs/core/testing/mstest-analyzers/mstest0040.md b/docs/core/testing/mstest-analyzers/mstest0040.md index eccdebe68e1b7..74bb770e9bc27 100644 --- a/docs/core/testing/mstest-analyzers/mstest0040.md +++ b/docs/core/testing/mstest-analyzers/mstest0040.md @@ -30,7 +30,7 @@ The use of any assertion method in an `async void` method, local function, or la ## Rule description -Exceptions that are thrown in an `async void` context are unhandled. A failing assertion in an `async void` method will be swallowed and will not crash the process when using VSTest under .NET Framework, and may crash the process when using Microsoft.Testing.Platform or VSTest under modern .NET, or even be silently swallowed in cases where a custom `SynchronizationContext` is present that catches the exception. +Exceptions that are thrown in an `async void` context are unhandled. A failing assertion in an `async void` method will be swallowed and will not crash the process when using VSTest under .NET Framework. Under .NET, a failing assertion in an `async void` method might crash the process when using Microsoft.Testing.Platform or VSTest. In cases where a custom `SynchronizationContext` is present that catches the exception, the failing assertion might be silently swallowed. ## How to fix violations