From c8c8d483502c4906f4c63f45db2f1fc9c7a2a650 Mon Sep 17 00:00:00 2001 From: "Terje Sandstrom (AAD)" Date: Tue, 25 Jul 2023 21:45:24 +0200 Subject: [PATCH 01/22] announcement nunit 4 highlights --- docs/articles/announcements/AssertNull.png | Bin 0 -> 41026 bytes docs/articles/announcements/Towards-NUnit4.md | 123 ++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 docs/articles/announcements/AssertNull.png create mode 100644 docs/articles/announcements/Towards-NUnit4.md diff --git a/docs/articles/announcements/AssertNull.png b/docs/articles/announcements/AssertNull.png new file mode 100644 index 0000000000000000000000000000000000000000..42ebebabbf50df96ae55fa36fc00b186a67aa216 GIT binary patch literal 41026 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%0Di)q<5@8 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 Tkaf={upK$*d7yM(V9I|1%pH8b literal 0 HcmV?d00001 diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md new file mode 100644 index 000000000..69f82ee97 --- /dev/null +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -0,0 +1,123 @@ +# Towards NUnit Version 4 + +NUnit 4 have been long in coming, but we now start to see the outline of it. +Along with NUnit 4 we will also change the release cadence, and turn more towards a [Semver](https://semver.org) based versioning scheme. This means we will try to release a version 4 as soon as we can, and then just move forward with new major releases faster than earlier. + +There are some interesting issues around NUnit 4 we would like to point you to. First of all is the [NUnit 4 planning issue](https://github.com/nunit/nunit/issues/3325). Then we have the upcoming [release notes page](https://github.com/nunit/docs/blob/62c43cbbd32b8424c974d5ec50d5463a5c4cd621/docs/articles/nunit/release-notes/framework.md), currently as a PR. There are also a [list of issues](https://github.com/nunit/nunit/issues/4431) related to changes in supported frameworks and assert messages. We have also added a milestone for version 4, so this [list of open issues](https://github.com/nunit/nunit/issues?q=is%3Aopen+is%3Aissue+milestone%3A4.0) could be useful. + +**Now to some highlights, and not necessarily in chronological order.** + +## Improved assert result messages + +The result messages in case of a failure has been improved to include the Assert statement that is used. + +Earlier code like: +```cs + [TestCase(42)] + public void TestInt(int val) + { + Assert.That(val, Is.EqualTo(4)); + } +``` +resulted in: +```txt +Message:  + Expected: 4 + But was: 42 +``` +Not a very descriptive message. + +In version 4 this is improved to also include the assert statement itself. + +The result will then be: +```txt +Message:  + Assert.That(val, Is.EqualTo(4)) + Expected: 4 + But was: 42 +``` + +This also handles more complex statements, like for the following code: +```cs + [Test] + public void TestDouble() + { + var sut = new Math(); + Assert.That(sut.Add(4.0, 2.0), Is.EqualTo(42.0).Within(0.1d), "Add double failed"); + } +``` +which then results in: +```txt +Message:  + Add double failed + Assert.That(sut.Add(4.0, 2.0), Is.EqualTo(42.0).Within(0.1d)) + Expected: 42.0d +/- 0.10000000000000001d + But was: 6.0d + Off by: 36.0d +``` +Note that the custom message is added before the Assert statement + +This becomes even more useful in Multiple Asserts, where there is a list of results from the different asserts, but very little information on which actual assert results in which message. + +Given the code: +```cs +[Test] + public void TestMultiple() + { + var x = 2; + Assert.Multiple(() => + { + Assert.That(x*2, Is.EqualTo(42)); + Assert.That(x*1+40, Is.EqualTo(42)); + Assert.That(x*3+42, Is.EqualTo(42)); + }); + } +``` +which in version 3 results in: +```txt +Message:  +Multiple failures or warnings in test: + 1) Expected: 42 + But was: 4 + + 2) Expected: 42 + But was: 48 +``` +This is with only 3 asserts hard to figure out, but with version 4 we get: +```txt +Message:  +Multiple failures or warnings in test: + 1) Assert.That(x*2, Is.EqualTo(42)) + Expected: 42 + But was: 4 + + 2) Assert.That(x*3+42, Is.EqualTo(42)) + Expected: 42 + But was: 48 +``` + +### Breaking change +* There is a breaking change with respect to the assert messages. The format with params args are no longer supported. If you need to create a message like that, you need to convert it to an interpolated string. + +### Developer details +The improved result messages have been implemented using the new [CallerArgumentExpression](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/caller-argument-expression) together with using a [FormattableString](https://learn.microsoft.com/en-us/dotnet/api/system.formattablestring?view=net-6.0) as the class for the message. + +## Nullability +Version 4 have implemented stricter nullability all over. We still have some places that needs to be fixed up, but all in all, it should be conformant to the nullability requirements. See [3376](https://github.com/nunit/nunit/issues/3376) for details. + +This has also, together with the improved assert messages, caused null values to be no longer allowed for messages. Code like the below will not compile (resulting in [CS0121](https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0121?f1url=%3FappId%3Droslyn%26k%3Dk(CS0121))): +![](AssertNull.png) + +## Platform support + +The lowest framework platforms support in Version 4 are **.net framework 4.6.2** and **.net 6.0**. + +## Classic/Legacy asserts + +The classic/legacy asserts, like `Assert.AreEqual`, have now been moved into its own project, and may be released as a separate package. They are now in the namespace `NUnit.Framework.Classic`. +In the early V4 alpha version they will be delivered in the standard NUnit package. + +This means that the default assert library going forward will be the `Constraint based` asserts. + + + From 66e23b3d82a98d78cfd64ac76dedfbd3bed96fb0 Mon Sep 17 00:00:00 2001 From: "Terje Sandstrom (AAD)" Date: Wed, 26 Jul 2023 14:53:18 +0200 Subject: [PATCH 02/22] Added announcement Towards Nunit4 --- docs/articles/announcements/Towards-NUnit4.md | 78 ++++++++++++++++--- 1 file changed, 69 insertions(+), 9 deletions(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 69f82ee97..aefb59238 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -1,15 +1,18 @@ # Towards NUnit Version 4 -NUnit 4 have been long in coming, but we now start to see the outline of it. -Along with NUnit 4 we will also change the release cadence, and turn more towards a [Semver](https://semver.org) based versioning scheme. This means we will try to release a version 4 as soon as we can, and then just move forward with new major releases faster than earlier. +*July 2023* -There are some interesting issues around NUnit 4 we would like to point you to. First of all is the [NUnit 4 planning issue](https://github.com/nunit/nunit/issues/3325). Then we have the upcoming [release notes page](https://github.com/nunit/docs/blob/62c43cbbd32b8424c974d5ec50d5463a5c4cd621/docs/articles/nunit/release-notes/framework.md), currently as a PR. There are also a [list of issues](https://github.com/nunit/nunit/issues/4431) related to changes in supported frameworks and assert messages. We have also added a milestone for version 4, so this [list of open issues](https://github.com/nunit/nunit/issues?q=is%3Aopen+is%3Aissue+milestone%3A4.0) could be useful. +NUnit 4 has been long-awaited, and we are now starting to see its outline taking shape. With the introduction of NUnit 4, we are also making changes to the release cadence, shifting towards a [Semver](https://semver.org) based versioning scheme. This entails aiming to release version 4 as soon as possible and subsequently accelerating the pace of new major releases compared to previous versions. + +We'd like to bring your attention to several interesting aspects regarding NUnit 4. First and foremost, there is a crucial [NUnit 4 planning issue](https://github.com/nunit/nunit/issues/3325) that we want to highlight. Additionally, we have an upcoming [release notes page](https://github.com/nunit/docs/blob/62c43cbbd32b8424c974d5ec50d5463a5c4cd621/docs/articles/nunit/release-notes/framework.md), currently in the form of a PR (Pull Request). If you're interested in changes related to supported frameworks and assert messages, we've compiled a [list of issues](https://github.com/nunit/nunit/issues/4431) for your reference. + +Moreover, we have created a milestone for version 4, which you can find here [list of open issues](https://github.com/nunit/nunit/issues?q=is%3Aopen+is%3Aissue+milestone%3A4.0). This milestone could be quite useful in tracking the progress and development of version 4. **Now to some highlights, and not necessarily in chronological order.** ## Improved assert result messages -The result messages in case of a failure has been improved to include the Assert statement that is used. +The result messages in case of a failure have been improved to now include the Assert statement that was used. Earlier code like: ```cs @@ -57,7 +60,7 @@ Message:  ``` Note that the custom message is added before the Assert statement -This becomes even more useful in Multiple Asserts, where there is a list of results from the different asserts, but very little information on which actual assert results in which message. +Including the Assert statement that caused the failure becomes particularly valuable in scenarios involving Multiple Asserts. In such cases, with a list of results from various asserts, it can be challenging to determine precisely which assert is responsible for each message. The improved result messages now offer clearer insights, making it easier to identify the specific assert that led to each failure. Given the code: ```cs @@ -97,16 +100,47 @@ Multiple failures or warnings in test: ``` ### Breaking change -* There is a breaking change with respect to the assert messages. The format with params args are no longer supported. If you need to create a message like that, you need to convert it to an interpolated string. +* Please be aware of a breaking change regarding assert messages in NUnit. The previous format with params args is no longer supported. If you require a similar message format, it is now necessary to convert it to an interpolated string. ### Developer details The improved result messages have been implemented using the new [CallerArgumentExpression](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/caller-argument-expression) together with using a [FormattableString](https://learn.microsoft.com/en-us/dotnet/api/system.formattablestring?view=net-6.0) as the class for the message. +## Proper async/await, you can now await the Asserts + +NUnit 3 has implemented async functionality using a pattern called 'sync-over-async.' This approach allowed for its implementation without requiring significant underlying changes. + +In version 4 proper async/await has been implemented with a series of new assert methods, `Assert.ThatAsync` which can be `await`'ed. + +```cs + [Test] + public async Task AssertionPasses_CompletedTaskWithResult_EqualsResult() + { + await Assert.ThatAsync(() => Task.FromResult(42), Is.EqualTo(42)); + } +``` + +Version 4 also introduces a new feature called Assert.MultipleAsync, which allows you to mix async and sync asserts within the same block. This enables you to perform multiple assertions, both asynchronous and synchronous, in a more concise and streamlined manner. Moreover, it's important to note that Assert.MultipleAsync is awaitable, providing flexibility in handling asynchronous operations and assertions. + +```cs + [Test] + public async Task AssertMultipleAsyncSucceeds() + { + await Assert.MultipleAsync(async () => + { + await Assert.ThatAsync(() => Task.FromResult(42), Is.EqualTo(42)); + Assert.That("hello", Is.EqualTo("hello")); + await Assert.ThatAsync(() => Task.FromException(new ArgumentNullException)), Throws.ArgumentNullException); + }); + } +``` + ## Nullability -Version 4 have implemented stricter nullability all over. We still have some places that needs to be fixed up, but all in all, it should be conformant to the nullability requirements. See [3376](https://github.com/nunit/nunit/issues/3376) for details. +Version 4 has implemented stricter nullability throughout the codebase. While there are still some areas that require fixing, overall, it should now conform to the nullability requirements. See [3376](https://github.com/nunit/nunit/issues/3376) for details. + +These changes, along with the improved assert messages, have resulted in null values no longer being allowed for messages. As a consequence, code like the example below will not compile and will result in [CS0121](https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0121?f1url=%3FappId%3Droslyn%26k%3Dk(CS0121))): -This has also, together with the improved assert messages, caused null values to be no longer allowed for messages. Code like the below will not compile (resulting in [CS0121](https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0121?f1url=%3FappId%3Droslyn%26k%3Dk(CS0121))): ![](AssertNull.png) +It's important to update such code to use valid non-null message strings ## Platform support @@ -114,10 +148,36 @@ The lowest framework platforms support in Version 4 are **.net framework 4.6.2** ## Classic/Legacy asserts -The classic/legacy asserts, like `Assert.AreEqual`, have now been moved into its own project, and may be released as a separate package. They are now in the namespace `NUnit.Framework.Classic`. +The classic/legacy asserts, like `Assert.AreEqual`, have now been moved into its own project, and will be released as a separate package. They are now in the namespace `NUnit.Framework.Classic`. In the early V4 alpha version they will be delivered in the standard NUnit package. This means that the default assert library going forward will be the `Constraint based` asserts. +Exactly how these methods will be used is not quite decided yet. We will probably need to do some namechanges to avoid clashes. + +## Testing it out + +If you add our Myget source to your app's nuget feeds, you can try out the new features yourself. + +Add a nuget.config like +```xml + + + + + + + + +``` +and replace your current NUnit Packagereference with +```xml + +``` + +## Feedback + +We do appreciate feedback on these version 4 features. +You can join in on the [discussion here](https://github.com/nunit/nunit/discussions/4437), comment in our [slack channel](https://nunit.slack.com), or if it is a bug or suggestion for improvement you can also raise an issue in our [github repo](https://github.com/nunit/nunit/issues). From fb24e692d594d798a734270b9dc7258f2bfff0a7 Mon Sep 17 00:00:00 2001 From: "Terje Sandstrom (AAD)" Date: Wed, 26 Jul 2023 15:11:25 +0200 Subject: [PATCH 03/22] updated --- docs/articles/announcements/Towards-NUnit4.md | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index aefb59238..fd4a0bd54 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -1,7 +1,5 @@ # Towards NUnit Version 4 -*July 2023* - NUnit 4 has been long-awaited, and we are now starting to see its outline taking shape. With the introduction of NUnit 4, we are also making changes to the release cadence, shifting towards a [Semver](https://semver.org) based versioning scheme. This entails aiming to release version 4 as soon as possible and subsequently accelerating the pace of new major releases compared to previous versions. We'd like to bring your attention to several interesting aspects regarding NUnit 4. First and foremost, there is a crucial [NUnit 4 planning issue](https://github.com/nunit/nunit/issues/3325) that we want to highlight. Additionally, we have an upcoming [release notes page](https://github.com/nunit/docs/blob/62c43cbbd32b8424c974d5ec50d5463a5c4cd621/docs/articles/nunit/release-notes/framework.md), currently in the form of a PR (Pull Request). If you're interested in changes related to supported frameworks and assert messages, we've compiled a [list of issues](https://github.com/nunit/nunit/issues/4431) for your reference. @@ -22,7 +20,9 @@ Earlier code like: Assert.That(val, Is.EqualTo(4)); } ``` + resulted in: + ```txt Message:  Expected: 4 @@ -33,6 +33,7 @@ Not a very descriptive message. In version 4 this is improved to also include the assert statement itself. The result will then be: + ```txt Message:  Assert.That(val, Is.EqualTo(4)) @@ -41,6 +42,7 @@ Message:  ``` This also handles more complex statements, like for the following code: + ```cs [Test] public void TestDouble() @@ -49,7 +51,9 @@ This also handles more complex statements, like for the following code: Assert.That(sut.Add(4.0, 2.0), Is.EqualTo(42.0).Within(0.1d), "Add double failed"); } ``` + which then results in: + ```txt Message:  Add double failed @@ -58,12 +62,15 @@ Message:  But was: 6.0d Off by: 36.0d ``` + Note that the custom message is added before the Assert statement Including the Assert statement that caused the failure becomes particularly valuable in scenarios involving Multiple Asserts. In such cases, with a list of results from various asserts, it can be challenging to determine precisely which assert is responsible for each message. The improved result messages now offer clearer insights, making it easier to identify the specific assert that led to each failure. Given the code: + ```cs + [Test] public void TestMultiple() { @@ -76,7 +83,9 @@ Given the code: }); } ``` + which in version 3 results in: + ```txt Message:  Multiple failures or warnings in test: @@ -86,7 +95,9 @@ Multiple failures or warnings in test: 2) Expected: 42 But was: 48 ``` + This is with only 3 asserts hard to figure out, but with version 4 we get: + ```txt Message:  Multiple failures or warnings in test: @@ -100,9 +111,11 @@ Multiple failures or warnings in test: ``` ### Breaking change + * Please be aware of a breaking change regarding assert messages in NUnit. The previous format with params args is no longer supported. If you require a similar message format, it is now necessary to convert it to an interpolated string. ### Developer details + The improved result messages have been implemented using the new [CallerArgumentExpression](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/caller-argument-expression) together with using a [FormattableString](https://learn.microsoft.com/en-us/dotnet/api/system.formattablestring?view=net-6.0) as the class for the message. ## Proper async/await, you can now await the Asserts @@ -135,6 +148,7 @@ Version 4 also introduces a new feature called Assert.MultipleAsync, which allow ``` ## Nullability + Version 4 has implemented stricter nullability throughout the codebase. While there are still some areas that require fixing, overall, it should now conform to the nullability requirements. See [3376](https://github.com/nunit/nunit/issues/3376) for details. These changes, along with the improved assert messages, have resulted in null values no longer being allowed for messages. As a consequence, code like the example below will not compile and will result in [CS0121](https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0121?f1url=%3FappId%3Droslyn%26k%3Dk(CS0121))): @@ -160,6 +174,7 @@ Exactly how these methods will be used is not quite decided yet. We will probab If you add our Myget source to your app's nuget feeds, you can try out the new features yourself. Add a nuget.config like + ```xml @@ -170,7 +185,9 @@ Add a nuget.config like ``` + and replace your current NUnit Packagereference with + ```xml ``` From 1e06d66ec651e4a5b88818ec1dbea94f56c91f1f Mon Sep 17 00:00:00 2001 From: "Terje Sandstrom (AAD)" Date: Wed, 26 Jul 2023 18:57:37 +0200 Subject: [PATCH 04/22] updated --- docs/articles/announcements/Towards-NUnit4.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index fd4a0bd54..ef2723c03 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -13,6 +13,7 @@ Moreover, we have created a milestone for version 4, which you can find here [li The result messages in case of a failure have been improved to now include the Assert statement that was used. Earlier code like: + ```cs [TestCase(42)] public void TestInt(int val) @@ -28,7 +29,8 @@ Message:  Expected: 4 But was: 42 ``` -Not a very descriptive message. + +Not a very descriptive message. In version 4 this is improved to also include the assert statement itself. @@ -153,7 +155,7 @@ Version 4 has implemented stricter nullability throughout the codebase. While th These changes, along with the improved assert messages, have resulted in null values no longer being allowed for messages. As a consequence, code like the example below will not compile and will result in [CS0121](https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0121?f1url=%3FappId%3Droslyn%26k%3Dk(CS0121))): -![](AssertNull.png) +![AssertNull](AssertNull.png) It's important to update such code to use valid non-null message strings ## Platform support @@ -162,7 +164,7 @@ The lowest framework platforms support in Version 4 are **.net framework 4.6.2** ## Classic/Legacy asserts -The classic/legacy asserts, like `Assert.AreEqual`, have now been moved into its own project, and will be released as a separate package. They are now in the namespace `NUnit.Framework.Classic`. +The classic/legacy asserts, like `Assert.AreEqual`, have now been moved into its own project, and will be released as a separate package. They are now in the namespace `NUnit.Framework.Classic`. In the early V4 alpha version they will be delivered in the standard NUnit package. This means that the default assert library going forward will be the `Constraint based` asserts. @@ -178,11 +180,11 @@ Add a nuget.config like ```xml - - - - - + + + + + ``` @@ -197,4 +199,3 @@ and replace your current NUnit Packagereference with We do appreciate feedback on these version 4 features. You can join in on the [discussion here](https://github.com/nunit/nunit/discussions/4437), comment in our [slack channel](https://nunit.slack.com), or if it is a bug or suggestion for improvement you can also raise an issue in our [github repo](https://github.com/nunit/nunit/issues). - From cebda02dd97608af6f09544f2b7dceb61f03f797 Mon Sep 17 00:00:00 2001 From: "Terje Sandstrom (AAD)" Date: Wed, 26 Jul 2023 19:14:36 +0200 Subject: [PATCH 05/22] updated --- docs/articles/announcements/Towards-NUnit4.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index ef2723c03..4fde24804 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -181,9 +181,9 @@ Add a nuget.config like - - - + + + ``` From 7415d6ed04af3c4a488450cd74240b9753063e94 Mon Sep 17 00:00:00 2001 From: "Terje Sandstrom (AAD)" Date: Wed, 26 Jul 2023 19:18:23 +0200 Subject: [PATCH 06/22] updated --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 4fde24804..83e2a3a8d 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -181,7 +181,7 @@ Add a nuget.config like - + From ed272886265d8df0d0f0d1b5d8dbbb368a534971 Mon Sep 17 00:00:00 2001 From: "Terje Sandstrom (AAD)" Date: Wed, 26 Jul 2023 19:37:21 +0200 Subject: [PATCH 07/22] updated --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 83e2a3a8d..39a8d71dc 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -155,7 +155,7 @@ Version 4 has implemented stricter nullability throughout the codebase. While th These changes, along with the improved assert messages, have resulted in null values no longer being allowed for messages. As a consequence, code like the example below will not compile and will result in [CS0121](https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0121?f1url=%3FappId%3Droslyn%26k%3Dk(CS0121))): -![AssertNull](AssertNull.png) +![AssertNull](./AssertNull.png) It's important to update such code to use valid non-null message strings ## Platform support From 7e125e38c6a89fbde5812fd13905d3031d477868 Mon Sep 17 00:00:00 2001 From: "Terje Sandstrom (AAD)" Date: Wed, 26 Jul 2023 19:42:31 +0200 Subject: [PATCH 08/22] updated --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 39a8d71dc..ca8ae6acb 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -155,7 +155,7 @@ Version 4 has implemented stricter nullability throughout the codebase. While th These changes, along with the improved assert messages, have resulted in null values no longer being allowed for messages. As a consequence, code like the example below will not compile and will result in [CS0121](https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0121?f1url=%3FappId%3Droslyn%26k%3Dk(CS0121))): -![AssertNull](./AssertNull.png) +![AssertNull](~/AssertNull.png) It's important to update such code to use valid non-null message strings ## Platform support From 1ef5118d7ae3b40b56ed891114472ba7fc11160d Mon Sep 17 00:00:00 2001 From: "Terje Sandstrom (AAD)" Date: Wed, 26 Jul 2023 19:44:33 +0200 Subject: [PATCH 09/22] updated --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index ca8ae6acb..4cd353bf8 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -155,7 +155,7 @@ Version 4 has implemented stricter nullability throughout the codebase. While th These changes, along with the improved assert messages, have resulted in null values no longer being allowed for messages. As a consequence, code like the example below will not compile and will result in [CS0121](https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0121?f1url=%3FappId%3Droslyn%26k%3Dk(CS0121))): -![AssertNull](~/AssertNull.png) +![AssertNull](~/announcements/AssertNull.png) It's important to update such code to use valid non-null message strings ## Platform support From cbc9894fdae860b42ebb8ae33113445f1aac9d56 Mon Sep 17 00:00:00 2001 From: "Terje Sandstrom (AAD)" Date: Wed, 26 Jul 2023 19:53:08 +0200 Subject: [PATCH 10/22] updated --- docs/articles/announcements/Towards-NUnit4.md | 2 +- .../announcements => images}/AssertNull.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/{articles/announcements => images}/AssertNull.png (100%) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 4cd353bf8..fde3c2b4f 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -155,7 +155,7 @@ Version 4 has implemented stricter nullability throughout the codebase. While th These changes, along with the improved assert messages, have resulted in null values no longer being allowed for messages. As a consequence, code like the example below will not compile and will result in [CS0121](https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0121?f1url=%3FappId%3Droslyn%26k%3Dk(CS0121))): -![AssertNull](~/announcements/AssertNull.png) +![AssertNull](~/images/AssertNull.png) It's important to update such code to use valid non-null message strings ## Platform support diff --git a/docs/articles/announcements/AssertNull.png b/docs/images/AssertNull.png similarity index 100% rename from docs/articles/announcements/AssertNull.png rename to docs/images/AssertNull.png From d1ecd0d52d12d25a395f357a308f998af2264d09 Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Fri, 28 Jul 2023 13:24:32 +0200 Subject: [PATCH 11/22] Update docs/articles/announcements/Towards-NUnit4.md Co-authored-by: Manfred Brands --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index fde3c2b4f..c7d2e28f6 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -169,7 +169,7 @@ In the early V4 alpha version they will be delivered in the standard NUnit packa This means that the default assert library going forward will be the `Constraint based` asserts. -Exactly how these methods will be used is not quite decided yet. We will probably need to do some namechanges to avoid clashes. +Exactly how these methods will be used is not quite decided yet. We will probably need to do some name changes to avoid clashes. ## Testing it out From fb48c86586d492b832c36229fceceef5935e345f Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Fri, 28 Jul 2023 13:26:12 +0200 Subject: [PATCH 12/22] Update docs/articles/announcements/Towards-NUnit4.md Co-authored-by: Manfred Brands --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index c7d2e28f6..51c289e4f 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -183,7 +183,7 @@ Add a nuget.config like - + ``` From d8c33b6b95bee073601fb5b8e3a6fb66ab8fa148 Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Wed, 16 Aug 2023 22:15:57 +0200 Subject: [PATCH 13/22] Update docs/articles/announcements/Towards-NUnit4.md Co-authored-by: Sean Killeen --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 51c289e4f..33dd95eed 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -2,7 +2,7 @@ NUnit 4 has been long-awaited, and we are now starting to see its outline taking shape. With the introduction of NUnit 4, we are also making changes to the release cadence, shifting towards a [Semver](https://semver.org) based versioning scheme. This entails aiming to release version 4 as soon as possible and subsequently accelerating the pace of new major releases compared to previous versions. -We'd like to bring your attention to several interesting aspects regarding NUnit 4. First and foremost, there is a crucial [NUnit 4 planning issue](https://github.com/nunit/nunit/issues/3325) that we want to highlight. Additionally, we have an upcoming [release notes page](https://github.com/nunit/docs/blob/62c43cbbd32b8424c974d5ec50d5463a5c4cd621/docs/articles/nunit/release-notes/framework.md), currently in the form of a PR (Pull Request). If you're interested in changes related to supported frameworks and assert messages, we've compiled a [list of issues](https://github.com/nunit/nunit/issues/4431) for your reference. +We'd like to bring your attention to several interesting aspects of NUnit 4. First and foremost, there is a crucial [NUnit 4 planning issue](https://github.com/nunit/nunit/issues/3325) that we want to highlight. Additionally, we have an upcoming [release notes page](https://github.com/nunit/docs/blob/62c43cbbd32b8424c974d5ec50d5463a5c4cd621/docs/articles/nunit/release-notes/framework.md), currently in the form of a PR (Pull Request). If you're interested in changes related to supported frameworks and assert messages, we've compiled a [list of issues](https://github.com/nunit/nunit/issues/4431) for your reference. Moreover, we have created a milestone for version 4, which you can find here [list of open issues](https://github.com/nunit/nunit/issues?q=is%3Aopen+is%3Aissue+milestone%3A4.0). This milestone could be quite useful in tracking the progress and development of version 4. From 7fcb6a5307f3082532cb2ac3a2c043d99a43875d Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Wed, 16 Aug 2023 22:16:09 +0200 Subject: [PATCH 14/22] Update docs/articles/announcements/Towards-NUnit4.md Co-authored-by: Sean Killeen --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 33dd95eed..a43275cfe 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -4,7 +4,7 @@ NUnit 4 has been long-awaited, and we are now starting to see its outline taking We'd like to bring your attention to several interesting aspects of NUnit 4. First and foremost, there is a crucial [NUnit 4 planning issue](https://github.com/nunit/nunit/issues/3325) that we want to highlight. Additionally, we have an upcoming [release notes page](https://github.com/nunit/docs/blob/62c43cbbd32b8424c974d5ec50d5463a5c4cd621/docs/articles/nunit/release-notes/framework.md), currently in the form of a PR (Pull Request). If you're interested in changes related to supported frameworks and assert messages, we've compiled a [list of issues](https://github.com/nunit/nunit/issues/4431) for your reference. -Moreover, we have created a milestone for version 4, which you can find here [list of open issues](https://github.com/nunit/nunit/issues?q=is%3Aopen+is%3Aissue+milestone%3A4.0). This milestone could be quite useful in tracking the progress and development of version 4. +Moreover, we have created a milestone for version 4, [which you can find a list of open issues for here](https://github.com/nunit/nunit/issues?q=is%3Aopen+is%3Aissue+milestone%3A4.0). This milestone could be useful in tracking the progress and development of version 4. **Now to some highlights, and not necessarily in chronological order.** From 55ebac3c24daebfc2029c43e784ca6d2bb38e09b Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Wed, 16 Aug 2023 22:16:19 +0200 Subject: [PATCH 15/22] Update docs/articles/announcements/Towards-NUnit4.md Co-authored-by: Sean Killeen --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index a43275cfe..bb65f5195 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -6,7 +6,7 @@ We'd like to bring your attention to several interesting aspects of NUnit 4. Fir Moreover, we have created a milestone for version 4, [which you can find a list of open issues for here](https://github.com/nunit/nunit/issues?q=is%3Aopen+is%3Aissue+milestone%3A4.0). This milestone could be useful in tracking the progress and development of version 4. -**Now to some highlights, and not necessarily in chronological order.** +Now to some highlights -- not necessarily in chronological order. ## Improved assert result messages From 6a2aa1e90f0aa3d205d23f9a5afdf7dc4922b15e Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Wed, 16 Aug 2023 22:16:30 +0200 Subject: [PATCH 16/22] Update docs/articles/announcements/Towards-NUnit4.md Co-authored-by: Sean Killeen --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index bb65f5195..58d4a3108 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -8,7 +8,7 @@ Moreover, we have created a milestone for version 4, [which you can find a list Now to some highlights -- not necessarily in chronological order. -## Improved assert result messages +## Improved Assert Result Messages The result messages in case of a failure have been improved to now include the Assert statement that was used. From 2900ce44b0d7ca42485a292c014b5cfbafb3b727 Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Wed, 16 Aug 2023 22:16:53 +0200 Subject: [PATCH 17/22] Update docs/articles/announcements/Towards-NUnit4.md Co-authored-by: Sean Killeen --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 58d4a3108..930e07f7a 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -10,7 +10,7 @@ Now to some highlights -- not necessarily in chronological order. ## Improved Assert Result Messages -The result messages in case of a failure have been improved to now include the Assert statement that was used. +Failure result messages now include the `Assert` statement that was used. Earlier code like: From ef0a075516946cbfdb853decdf7aa28de229973c Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Wed, 16 Aug 2023 22:18:51 +0200 Subject: [PATCH 18/22] Update docs/articles/announcements/Towards-NUnit4.md Co-authored-by: Sean Killeen --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 930e07f7a..1f63c742a 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -167,7 +167,7 @@ The lowest framework platforms support in Version 4 are **.net framework 4.6.2** The classic/legacy asserts, like `Assert.AreEqual`, have now been moved into its own project, and will be released as a separate package. They are now in the namespace `NUnit.Framework.Classic`. In the early V4 alpha version they will be delivered in the standard NUnit package. -This means that the default assert library going forward will be the `Constraint based` asserts. +This means that the default assertion syntax going forward will be the "constraint-based" asserts. Exactly how these methods will be used is not quite decided yet. We will probably need to do some name changes to avoid clashes. From 6ba8adc75a5d9e3375f5008ad3609cd93cc4e4a3 Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Wed, 16 Aug 2023 22:19:05 +0200 Subject: [PATCH 19/22] Update docs/articles/announcements/Towards-NUnit4.md Co-authored-by: Sean Killeen --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 1f63c742a..89338b552 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -169,7 +169,7 @@ In the early V4 alpha version they will be delivered in the standard NUnit packa This means that the default assertion syntax going forward will be the "constraint-based" asserts. -Exactly how these methods will be used is not quite decided yet. We will probably need to do some name changes to avoid clashes. +Exactly how these methods will be used is not quite decided yet. We will probably need to do some name changes to avoid clashes. ## Testing it out From d345c568ebcc8b1571e931f93ceca6b320376ec8 Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Wed, 16 Aug 2023 22:19:23 +0200 Subject: [PATCH 20/22] Update docs/articles/announcements/Towards-NUnit4.md Co-authored-by: Sean Killeen --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 89338b552..6ac538364 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -175,7 +175,7 @@ Exactly how these methods will be used is not quite decided yet. We will probabl If you add our Myget source to your app's nuget feeds, you can try out the new features yourself. -Add a nuget.config like +Add or modify your `nuget.config` to add the package resources such as below: ```xml From e595f51df11be5ede479520f6d5dd2f1ce590aed Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Wed, 16 Aug 2023 22:19:33 +0200 Subject: [PATCH 21/22] Update docs/articles/announcements/Towards-NUnit4.md Co-authored-by: Sean Killeen --- docs/articles/announcements/Towards-NUnit4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/announcements/Towards-NUnit4.md index 6ac538364..abb25b737 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/announcements/Towards-NUnit4.md @@ -188,7 +188,7 @@ Add or modify your `nuget.config` to add the package resources such as below: ``` -and replace your current NUnit Packagereference with +Then, replace your current NUnit `PackageReference` with: ```xml From fb5a99719d286a2c96875ca9c4d1d5a05b9c0add Mon Sep 17 00:00:00 2001 From: "Terje Sandstrom (AAD)" Date: Wed, 16 Aug 2023 22:44:23 +0200 Subject: [PATCH 22/22] updated towards Nunit4 --- .../Towards-NUnit4.md | 31 +++++++++++++++++-- docs/articles/nunit/toc.yml | 2 ++ 2 files changed, 31 insertions(+), 2 deletions(-) rename docs/articles/{announcements => nunit}/Towards-NUnit4.md (88%) diff --git a/docs/articles/announcements/Towards-NUnit4.md b/docs/articles/nunit/Towards-NUnit4.md similarity index 88% rename from docs/articles/announcements/Towards-NUnit4.md rename to docs/articles/nunit/Towards-NUnit4.md index abb25b737..2f07688ab 100644 --- a/docs/articles/announcements/Towards-NUnit4.md +++ b/docs/articles/nunit/Towards-NUnit4.md @@ -173,6 +173,10 @@ Exactly how these methods will be used is not quite decided yet. We will probabl ## Testing it out +We have development packages deployed to a Myget feed, and now we have also added a github packages feed. If you're using the latter you need to authenticate yourself, once that is done anyone can grab from that feed. + +### Myget + If you add our Myget source to your app's nuget feeds, you can try out the new features yourself. Add or modify your `nuget.config` to add the package resources such as below: @@ -183,7 +187,7 @@ Add or modify your `nuget.config` to add the package resources such as below: - + ``` @@ -191,9 +195,32 @@ Add or modify your `nuget.config` to add the package resources such as below: Then, replace your current NUnit `PackageReference` with: ```xml - + ``` +### Github packages + +Add or modify your `nuget.config` to add the package resources such as below: + +```xml + + + + + + + + +``` + +Then, replace your current NUnit `PackageReference` with: + +```xml + +``` + +* Note: The versions should be the same, we're working on aligning the version numbers. + ## Feedback We do appreciate feedback on these version 4 features. diff --git a/docs/articles/nunit/toc.yml b/docs/articles/nunit/toc.yml index 005425628..571fc3a91 100644 --- a/docs/articles/nunit/toc.yml +++ b/docs/articles/nunit/toc.yml @@ -1,5 +1,7 @@ - name: Introduction href: intro.md +- name: NUnit 4 plans + href: Towards-NUnit4.md - name: Release Notes href: release-notes/toc.yml topicHref: release-notes/framework.md