天天看点

巧用CSI 进行dll或程序的简易单元测试

自从 Roslyn 面世已来,围绕.net的各种风声水起。到底它有何妙之处以至一石击起千层浪呢?首先咱们来来看它的主人微软是怎么说它的:“Compiler-as-a-Service”、”APIs”、“script”、“open source” 等等。

今天我要谈的是其中的一个小工具 CSI(Compiler Services Interactive) 的应用。这个小东东其实很好理解,就是C# Code AS Script ,即把命令行输入的内容当作C# 脚本进行动态编译处理。因为有这一个功能,苦逼的BUG工程师终于有福利了,因为使用CSI可以很方便的让我们对做程序进行调试工作了,bug的复现也就容易很多了。下面是几个用CSI当测试工具使常用的几个技巧:

1. Roslyn 在哪里?

NuGet里,你只需要引入:Microsoft.Net.Compilers、Microsoft.CodeAnalysis就可以使用它了
           

2. 怎么用Roslyn进行调试?

对于WinForm程序,一般躲在
 package/Microsoft.Net.Compilers{version?}/tools目录下
 对于Web程序,一般生成后,bin/roslyn目录下
           

3. 怎么用?

双击csi.exe即可开始使用
           

4. 怎么加载程序集?

#r "程序集名称,如果不在当前目录,则使用相对路径或完整路径"
#load "添加.cs文件或程序集"
一般情况下#r 用来加载程序集 #load 用来加载文件
           

5. 怎么调试?

这个没有技巧,你就把它当作写单元测试来。如:
           
#r "E:\datasource\ihu.doctor\lib\Common.dll"
using Sinldo.Common.Extensions;
using static System.Console;

public static string FindString(string value, string search, out int index, out string[] parts)
{
    parts = value.DefaultNumberSplit();
    index = ;
    foreach (var part in parts)
    {
        if (part == search)
        {
            return part;
        }
        index++;
    }
    return null;
}

string val = "123,456,789,012,456,798,5689,5678,568,782,458,962";
int index;
string[] parts;
string result = FindString(val, "568", out index, out parts);

WriteLine(string.Join(",", parts));
WriteLine($"index:{index},value:{result}");
           

6. 简易输出?

想要简单直接打印结果内容,由其是一些复杂的结构,你可以输入要打印的变量,后面不要带“;”即可。
           

继续阅读