3)创建,测试,发布 第一个NET CORE程序

工具:Visual Studio Code 或者 Visual Studio

环境:.NET CORE 2.0

VS Code很强大 当然支持netcore的开发,但是我还是选择更熟悉更强大的VS。

vs2017或最新2019都自带netcore,如果没有你要的版本,可以自己手动下载,地址:https://dotnet.microsoft.com/download

创建项目:

1)  启动 Visual Studio 2017。 从菜单栏中选择“文件” > “新建” > “项目” 。 在“新项目” *对话框中,依次选择“Visual C#” 和“.NET Core” 节点。 然后,选择“控制台应用程序(.NET Core)” 项目模板。 在“名称” 文本框中,键入“HelloWorld”。 选择“确定” 按钮。

 

2)   Visual Studio 使用模板创建项目。 C# .NET Core 控制台应用程序模板会自动定义类 Program 和一个需要将 String 数组用作自变量的方法 Main。 Main 是应用程序入口点,同时也是在应用程序启动时由运行时自动调用的方法。 args 数组中包含在应用程序启动时提供的所有命令行自变量。

 

对比framework 除了依赖项(引用)有点差异其他都差不多.

3)   若要在应用程序关闭控制台窗口前将其暂停,请在调用 Console.WriteLine(String) 方法后立即添加下列代码:

Console.Write("Press any key to continue..."); Console.ReadKey(true);

此代码会提示用户按任意键,然后在用户按键前暂停程序。

  1. 在菜单栏中,选择“生成” > “生成解决方案” 。 这会将程序编译成一种中间语言 (IL),然后由实时 (JIT) 编译器转换成二进制代码。
  2. 选择工具栏上含绿色箭头的“HelloWorld” 按钮,从而运行程序。

改进“Hello World”应用程序

改进应用程序,提示用户输入名字,并将其与日期和时间一同显示。 若要修改和测试程序,请执行以下操作:

  1. 在代码窗口中,在 static void Main(string[] args) 代码行后面的左括号和第一个右括号之间,输入以下 C# 代码:
Console.WriteLine("\nWhat is your name? "); var name = Console.ReadLine(); var date = DateTime.Now; Console.WriteLine($"\nHello, {name}, on {date:d} at {date:t}!"); Console.Write("\nPress any key to exit..."); Console.ReadKey(true);

替换 Main 方法的内容。 

此代码在控制台中显示“What is your name?”, 然后等待用户输入字符串并按 Enter 键。 它将此字符串存储到名为 name 的变量中。 它还会检索 DateTime.Now 属性的值(其中包含当前的本地时间),并将此值赋给 date 变量。 最后,使用内插字符串在控制台窗口中显示这些值。

  1. 依次选择 生成” > 生成解决方案” ,编译此程序。
  2. 选择工具栏上的绿色箭头、按 F5 或选择“调试” > “启动调试” 菜单项,在 Visual Studio 的调试模式下运行程序。 出现提示时,输入名称并按 Enter 键。

 

创建NET STANDARD类库 :

  1. 在“解决方案资源管理器”中,右键单击“ClassLibraryProjects”解决方案文件,然后从上下文菜单中选择“添加” > “新项目”。
  2. 在“添加新项目”对话框中,展开“Visual C#”节点,并依次选择“.NET Standard”节点和“类库(.NET Standard)”项目模板。 在“名称”文本框中,输入项目名称“StringLibrary”。 选择“确定”,创建类库项目。

 

然后,代码窗口在 Visual Studio 开发环境中打开。

 

  1. 请检查以确保库定目标到 .NET Standard 的正确版本。 右键单击“解决方案资源管理器”窗口中的库项目,再选择“属性”。 “目标框架”文本框显示定目标到 .NET Standard 2.0。 

4.将代码窗口中的代码替换为以下代码,并保存文件:

 1 using System;
 2 
 3 namespace StringLibrary
 4 {
 5     public static class StringExt
 6     {
 7         public static bool StartsWithUpper(this String str)
 8         {
 9             if (String.IsNullOrWhiteSpace(str))
10                 return false;
11 
12             Char ch = str[0];
13             return Char.IsUpper(ch);
14         }
15     }
16 }
View Code

4.右键类库,生成,没有错误的话应该生成成功。

以 NuGet 包的形式分发类库:

采用 NuGet 包的形式发布类库,让类库可供更多调用方使用

  1. 打开控制台窗口。 例如,在 Windows 任务栏的“有问题尽管问我” 文本框中,输入 Command Prompt(或缩写 cmd),然后选择“命令提示符” 桌面应用或按 Enter(如果已在搜索结果中选中控制台窗口),打开控制台窗口。
  2. 转到类库的项目目录。 除非重新配置了典型文件位置,否则文件通常位于 Documents\Visual Studio 2017\Projects\ClassLibraryProjects\StringLibrary 目录中。 此目录包含源代码和项目文件 StringLibrary.csproj 。
  3. 发出命令 dotnet pack --no-build。 此时,dotnet 实用工具会生成一个扩展名为 .nupkg 的包。

 

创建单元测试项目

  1. 在“解决方案资源管理器” 中,打开“NetCoreSolution” 解决方案节点的上下文菜单,再依次选择“添加” > “新项目” 。
  2. 在“添加新项目” 对话框中,选择“Visual C#” 节点。 然后,依次选择“.NET Core” 节点和“MSTest 测试项目(.NET Core)” 项目模板。 在“名称” 文本框中,输入项目名称“StringLibraryTest”。 选择“确定” ,创建单元测试项目。

 

 备注:除了 MSTest 测试项目之外,还可以使用 Visual Studio 为 .NET Core 创建 xUnit 测试项目。

此时,Visual Studio 会创建项目,并在代码窗口中打开 UnitTest1.cs 文件。 

单元测试模板创建的源代码负责执行以下操作:

  它会导入 Microsoft.VisualStudio.TestTools.UnitTesting 命名空间,其中包含用于单元测试的类型。

  向 UnitTest1 类应用 TestClassAttribute 特性。 测试类中标记有 [TestMethod] 属性的所有测试方法都会在单元测试运行时自动执行。

  它会应用 TestMethodAttribute 属性,将 TestMethod1 定义为在单元测试运行时自动执行的测试方法。

  1. 在“解决方案资源管理器” 中,右键单击“StringLibraryTest” 项目的“依赖项” 节点,并从上下文菜单中选择“添加引用” 。

 

  1. 在“引用管理器” 对话框中,展开“项目” 节点,并选中“StringLibrary” 旁边的框。 添加对 StringLibrary 程序集的引用后,编译器可以查找 StringLibrary 方法。 选择“确定” 按钮。 这会添加对类库项目 StringLibrary 的引用。

 

添加并运行单元测试方法

  运行单元测试时,Visual Studio 执行单元测试类(对其应用了 TestClassAttribute 特性的类)中标记有 TestMethodAttribute 特性的所有方法。 当第一次遇到测试不通过或测试方法中的所有测试均已成功通过时,测试方法终止。

最常见的测试调用 Assert 类的成员。 许多断言方法至少包含两个参数,其中一个是预期的测试结果,另一个是实际的测试结果。 下表显示了最常调用的一些方法。

断言方法

函数

Assert.AreEqual

验证两个值或对象是否相等。 如果值或对象不相等,则断言失败。

Assert.AreSame

验证两个对象变量引用的是否是同一个对象。 如果这些变量引用不同的对象,则断言失败。

Assert.IsFalse

验证条件是否为 false。 如果条件为 true,则断言失败。

Assert.IsNotNull

验证对象是否不为 null。 如果对象为 null,则断言失败。

还可向测试方法应用 ExpectedExceptionAttribute 特性。 它指明了测试方法预计会引发的异常类型。 如果未抛出指定异常,则测试不通过。

测试 StringLibrary.StartsWithUpper 方法时,需要提供许多以大写字符开头的字符串。 在这种情况下,此方法应返回 true,以便可以调用 IsTrue 方法。 同样,需要提供许多以非大写字符开头的字符串。 在这种情况下,此方法应返回 false,以便可以调用 IsFalse 方法。

由于库方法处理的是字符串,因此还需要确保它能够成功处理空字符串 (String.Empty)(不含字符且 Length 为 0 的有效字符串)和 null 字符串(尚未初始化的字符串)。 如果对 String 实例调用 StartsWithUpper 作为扩展方法,无法向其传递 null 字符串。 不过,还可以直接将其作为静态方法进行调用,并向其传递一个 String 自变量。

将定义三个方法,每个方法都会对字符串数组中的各个元素反复调用它的 Assert 方法。 由于测试方法在第一次遇到测试不通过时会立即失败,因此将调用方法重载,以便传递字符串来指明方法调用中使用的字符串值。

创建测试方法:

 1 using System;
 2 using Microsoft.VisualStudio.TestTools.UnitTesting;
 3 using StringLibrary;
 4 namespace StringLibraryTest
 5 {
 6     [TestClass]
 7     public class UnitTest1
 8     {
 9         [TestMethod]
10         public void TestStartsWithUpper()
11         {
12             // Tests that we expect to return true.
13             string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" };
14             foreach (var word in words)
15             {
16                 bool result = word.StartsWithUpper();
17                 Assert.IsTrue(result,
18                        String.Format("Expected for '{0}': true; Actual: {1}",
19                                      word, result));
20             }
21         }
22 
23         [TestMethod]
24         public void TestDoesNotStartWithUpper()
25         {
26             // Tests that we expect to return false.
27             string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
28                                "1234", ".", ";", " " };
29             foreach (var word in words)
30             {
31                 bool result = word.StartsWithUpper();
32                 Assert.IsFalse(result,
33                        String.Format("Expected for '{0}': false; Actual: {1}",
34                                      word, result));
35             }
36         }
37 
38         [TestMethod]
39         public void DirectCallWithNullOrEmpty()
40         {
41             // Tests that we expect to return false.
42             string[] words = { string.Empty, null };
43             foreach (var word in words)
44             {
45                 bool result = StringExt.StartsWithUpper(word);
46                 Assert.IsFalse(result,
47                        String.Format("Expected for '{0}': false; Actual: {1}",
48                                      word == null ? "<null>" : word, result));
49             }
50         }
51     }
52 }
View Code
  1. 请注意,TestStartsWithUpper 方法中测试的大写字符包括希腊文大写字母 alpha (U+0391) 和西里尔文大写字母 EM (U+041C),TestDoesNotStartWithUpper 方法中测试的小写字符包括希腊文小写字母 alpha (U+03B1) 和西里尔文小写字母 Ghe (U+0433)。
  2. 在菜单栏上,选择“文件” > “将 UnitTest1.cs 另存为” 。 在“文件另存为” 对话框中,选择“保存” 按钮旁边的箭头,然后选择“保存时使用编码” 。

 

  1. 在“确认另存为” 对话框中,选择“是” 按钮,保存文件。
  2. 在“高级保存选项” 对话框的“编码” 下拉列表中,选择“Unicode (UTF-8 带签名) - 代码页 65001” ,然后选择“确定” 。

 

如果无法将源代码保存为 UTF8 编码文件,Visual Studio 可能会将其另存为 ASCII 文件。 在这种情况下,运行时将无法准确解码 ASCII 范围以外的 UTF8 字符,且测试结果也会不准确。

  1. 在菜单栏上,选择“测试” > “运行” > “所有测试” 。 此时,“测试资源管理器” 窗口打开并显示测试已成功运行。 “通过的测试” 部分列出了三个测试,“摘要” 部分报告了测试运行结果。

 

处理未通过的测试

由于运行的测试均通过,因此需进行少量改动,以使其中一个测试方法失败:

  1. 通过修改 TestDoesNotStartWithUpper 方法中的 words 数组来包含字符串“Error”。 由于 Visual Studio 将在生成运行测试的解决方案时自动保存打开的文件,因此无需手动保存。

string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",                    "1234", ".", ";", " " };

  1. 从菜单栏中选择“测试” > “运行” > “所有测试” ,运行测试。 “测试资源管理器” 窗口指示有两个测试成功,还有一个失败。

 

  1. 在“未通过的测试” 部分中,选择未通过的测试 TestDoesNotStartWith。 “测试资源管理器”窗口显示断言生成的消息: “Assert.IsFalse 失败。 “Error”应返回 false;实际返回 True”。 由于此次失败,数组中“Error”之后的所有字符串都未进行测试。

 

  1. 撤消在步骤 1 中执行的修改并删除字符串“Error”。 重新运行测试,测试将通过。

  发  布:

测试类库成功之后,我们在控制台应用中可以使用我们写的类库了。右键-引用 添加StringLibrary项目;

在输出控制台转换我们输出的字符,代码:

1  static void Main(string[] args)
2 {
3 Console.WriteLine("\nWhat is your name? ");
4 var name = Console.ReadLine();
5 var date = DateTime.Now;
6 Console.WriteLine($"\nHello,{name} 是否大写开始:{name.StartsWithUpper()}, on {date:d} at {date:t}!");
7 Console.Write("\nPress any key to exit...");
8 Console.ReadKey(true);
9 }
View Code

将工具栏上的生成配置设置从“Debug 更改为“Release” 。

右键单击“MyConsoleApp” 项目(而不是 NetCoreSolution 解决方案),然后选择菜单中的“发布” 。 还可以选择 生成” Visual Studio 主菜单中的 发布 MyConsoleApp” 。

  

  1. 打开控制台窗口。 例如,在 Windows 任务栏的“在此处键入内容以进行搜索” 文本框中,输入“Command Prompt”(或缩写“cmd”),再选择“命令提示符” 桌面应用程序或按 Enter(如果已在搜索结果中选择),打开控制台窗口。
  2. 导航到已发布的应用程序,它位于应用程序项目目录的 bin\Release\netcoreapp2.2\publish\ 子目录中。 如下图所示,已发布的输出包括以下四个文件:

1.  MyConsoleApp.deps.json

应用程序的运行时依赖项文件。 它定义了运行应用程序所需的 .NET Core 组件和库(包括包含该应用程序的动态链接库)。 有关详细信息,请参阅运行时配置文件

2.  MyConsoleApp.dll

包含应用程序的文件。 它是一个动态链接库,可通过在控制台窗口中输入 dotnet MyConsoleApp.dll 命令来执行。

3.  MyConsoleApp.pdb (对于部署是可选的)

包含调试符号的文件。 尽管应在需要调试应用程序的已发布版本时保存此文件,但无需将此文件与应用程序一起部署。

4.  MyConsoleApp.runtimeconfig.json

应用程序的运行时配置文件。 它标识用于运行应用程序的 .NET Core 版本。 有关详细信息,请参阅运行时配置文件

 

发布过程中会生成依赖于框架的部署,在此类部署中,若系统上安装了 .NET Core,已发布的应用程序可在 .NET Core 支持的任何平台上运行。 用户可以通过在控制台窗口中发出 dotnet MyConsoleApp.dll 命令来运行应用程序。

  

猜你喜欢

转载自www.cnblogs.com/rbsky/p/11431805.html