电脑不想装几十个G的 VS2017,那就用 VS Code 吧
目标:
创建一个类库项目 Skany.Core,并用 Nuget 引用第三方组件 Hash 实现加密算法
创建一个单元测试项目 Skany.Tests,引用类库 Skany.Core,并测试其中的方法
创建一个控制台应用程序项目 Skany.Output,引用类库 Skany.Core,并输出方法执行结果
创建一个解决方案 Skany.sln,包括以上三项目
环境
.NET Core SDK 2.2.202
开始
首先在 VS Code 安装几个扩展插件
C#
C# Extensions
.NET Core Test Explorer
这三个插件就可以做最基础的开发了
构建项目
创建解决方案文件夹 C:\Here\Skany
在 VS Code 中打开这个文件夹
在 VS Code 中打开终端(也可以在外部使用cmd或powershell)
接下来将使用 .NET Core CLI 命令创建项目
# 创建类库项目 dotnet new classlib -n Skany.Core # 创建控制台应用程序 dotnet new console -n Skany.Output # 创建xUnit单元测试项目 dotnet new xunit -n Skany.Tests # 为 Output 添加 Core 引用(因为当前在解决方案目录,而不是项目目录,所以add后要加上项目名,以下同理) dotnet add Skany.Output reference Skany.Core # 为 Tests 添加 Core 引用 dotnet add Skany.Tests reference Skany.Core # 为 Core 项目添加 Nuget 引用 dotnet add Skany.Core package Hash --version 4.0.0 # 创建解决方案 sln dotnet new sln -n Skany # 添加项目到解决方案 dotnet sln Skany.sln add Skany.Core dotnet sln Skany.sln add Skany.Output dotnet sln Skany.sln add Skany.Tests # 编译一下 Output 和 Tests 项目 dotnet build Skany.Output dotnet build Skany.Tests
当不熟悉命令时,都可以通过 -h 或 --help 参数获取帮助,比如我不知道单元测试项目的参数,就输入 dotnet new -h 查看 new 的选项
注:其实用第三方插件(比如 vscode-solution-explorer)轻松实现以上命令的可视化操作,这里只是演示 .NET Core CLI 命令用法
创建完后的项目结构
SKANY | Skany.Core | Class1.cs | Skany.Core.csproj | Skany.Output | Program.cs | Skany.Output.csproj | Skany.Tests | UnitTest1.cs | Skany.Tests.csproj | Skany.sln
将 Core 项目中的 Class1.cs 改为 CryptHelper.cs,代码如下
using HashLibrary; namespace Skany.Core { public class CryptHelper { public static string HashPassword(string password, out string salt) { var hash = HashedPassword.New(password, hashLength: 50, saltLength: 10); salt = hash.Salt; return hash.Hash; } public static bool VerifyPassword(string password, string hashPassword, string salt) { var hash = new HashedPassword(hashPassword, salt); bool matches = hash.Check(password); return matches; } } }
在 Tests 项目中别写测试案例,将 UnitTest1.cs 改为 CryptUnitTest.cs,代码如下
using System; using Xunit; namespace Skany.Tests { using Core; public class CryptUnitTest { [Theory] [InlineData("zhang")] [InlineData("baidu")] public void HashPasswordTest(string password) { string salt; var hashPassword = CryptHelper.HashPassword(password, out salt); Assert.NotNull(hashPassword); Assert.NotNull(salt); Assert.True(hashPassword.Length == CryptHelper.HashLength); Assert.True(salt.Length == CryptHelper.SaltLength); VerifyPasswordTest(password, hashPassword, salt); } [Theory] [InlineData("zhang", "ÁēÕĀ1fv¾ĒëÜĝ}f§¼kÈ$Æ7KĎĞĐMĬZĝČ9ËÅ«¢ÝĪÙØê£İ)¥jµQIįa", "ïÛŀB³äĭonÊ")] [InlineData("baidu", " g©®Ģ¹Óäõ¥ģH»7ċuO¸%AOĮ©ĩ§8ĆKĄöĉĖß$µåˬüÖ=ĝĴ¶Cꨧh/", "ĀĖ§į^H7Í_h")] public void VerifyPasswordTest(string password, string hashPassword, string salt) { Assert.True(hashPassword.Length == CryptHelper.HashLength); Assert.True(salt.Length == CryptHelper.SaltLength); Assert.True(CryptHelper.VerifyPassword(password, hashPassword, salt)); } } }
单元测试
通过命令执行单元测试
dotnet test Skany.Tests
如果只想测试其中一个方法 HashPasswordTest
dotnet test Skany.Tests --filter HashPasswordTest
当然有可视化的测试插件,谁还用命令啊
控制台应用程序
在 Output 项目调用 Core.CryptHelper 输出结果,代码如下