03 C#的函数、调试和单元测试

本文是《C# 8.0 and .NET Core 3.0 – Modern Cross-Platform Development》(4th Edition by Mark J. Price)的第4章「Writing, Debugging, and Testing Functions 」部分的学习笔记。

主要内容包括:

  • 在VS Code中写一些简单的函数
  • 代码的调试和日志
  • 通过xUnit.net来完成单元测试

1 函数

1.1 DRY

要开始编程了,首先明确编程的一个最基本的原则是:不要重复(Don’t Repeat Yourself, DRY)。
当发现自己在一边又一遍的写同样的语句时,你么就要把这些语句变成一个函数。函数可以看作是完成一个个小任务的黑箱,一般会有输入输出,定义好后不用去想它具体是怎么工作的,直接用就好了。

1.2 递归

递归是一种比较巧妙的技巧,它是在其实现中直接或间接的调用自己的函数。在使用时需要小心,函数调用过多会导致堆栈溢出,因为函数调用都是要用内存来存储数据以致占用过多的内存。

1.3 XML注释

在编译器中调用一个函数后,一般都会显示一些描述信息,这些描述信息是在函数定义时写的XML注释。
在Visual Studio Code中,可以通过C# XML Documentation Comments扩展来辅助编写,只需在函数定义前输入///,该扩展就会自动填充XML注释。默认的注释如下:

/// 
/// 
/// 
/// 
/// 

最佳实践:是对所有的函数都添加XML文档注释。

2 调试

2.1 Debug

在VS Coe中调试C#,直接点击program.cs文件,OmniSharp会在编辑器中加载,并提示添加一些用来build和debug应用的配置,这些配置是会存放在.vscode文件夹中,包括:

  • launch.json
  • task.json

我在调试时碰到过两个问题,可以参考《VS Code调试C#的两个问题:不能读取用户输入和exit code 1 错误》。

  • 调试时通过断点来设置期望暂停并检查的语句,VS Code提供调试工具条来辅助调试的过程,提供调试窗口来查看具体的细节。
  • 除了编译器自带的调试窗口外,还有第三方的工具,比如LINQPad,能将复杂的嵌套对象的值快速输出到工具窗口中。类似的跨平台的工具时SharpPad扩展。

2.2 日志

当应用部署后,我们也期望能在程序运行,特别是出现异常时,记录正在发生的事情,以追踪问题并修复问题,这就需要用到日志(log)。
有两种类型来添加日志记录:

  • 调试(Debug):用于添加开发(development)过程中写入的日志
  • 跟踪(Trace):用于添加在开发(development)和运行(runtime)时写入的日志

Trace记录的内容有4类,具体如下表所示:
03 C#的函数、调试和单元测试_第1张图片

3 单元测试

单元测试是在开发过程的早期发现bug的好方法。有些开发人员遵循测试驱动开发(Test-Driven Development, TDD)原则,即程序员应在编写代码之前创建单元测试。

微软官方有一个MS Test的专有单元测试框架,这里我们使用第三方的框架xUnit.net。

其步骤简单记录为:

  • 创建xunit的工程 dotnet new xunit
  • 在.csproj文件中引用要测试的类
  • Build该xunit测试工程dotnet build
  • 在.cs文件中编写单元测试,xunit使用[Fact]表示一个测试,其遵循经典的三段式:
    • Arrange:该部分将声明和实例化输入和输出的变量
    • Act:执行要测试的单元
    • Assert:对输出执行一个或多个断言,如果不为真则表示测试失败
[Fact]
public void TestAdding2And2()
{
// arrange
double a = 2;
double b = 2;
double expected = 4;
var calc = new Calculator(); 
// act
double actual = calc.Add(a, b); 
// assert 
Assert.Equal(expected, actual); } 
  • 执行单元测试dotnet test

你可能感兴趣的:(C#,.NET,Core,单元测试,visual,studio,code,c#,xunit)