MSTestでprivateメソッドをテストする

MSTestでprivateメソッドをテストする方法。

下記のサンプルクラスを使用します。

MyClassは、privateメソッドの”greet”と、staticのprivateメソッド”add”を持ちます。

public class MyClass
{
  private string greet(string name)
  {
    return "Hello " + name;
  }

  private static int add(int a, int b)
  {
      return a + b;
  }
}

privateメソッドのテスト

privateメソッドをテストするには、PrivateObjectクラスのInvokeメソッドを使用します。

[TestMethod]
public void TestGreet()
{
  var myClass = new MyClass();
  var pbObj = new PrivateObject(myClass);
  var actual = (string)pbObj.Invoke("greet", "World");
  Assert.AreEqual("Hello World", actual);
}

テスト対象のインスタンスを引数にして、PrivateObjectのオブジェクトを作成します。

実行するprivateメソッドの名前と、メソッドの引数をInvokeメソッドに渡します。
Invokeメソッドはobjectを返しますので、適切な型に変換します。

private staticのテスト

private staticメソッドをテストするには、PrivateTypeクラスのInvokeStaticメソッドを使用します。

[TestMethod]
public void TestAdd()
{
  PrivateType privateType = new PrivateType(typeof(MyClass));
  int actual = (int)privateType.InvokeStatic("add", 1, 2);
  Assert.AreEqual(3, actual);
}

staticなprivateメソッドをテストするには、テストするクラスを引数にしてPrivateTypeオブジェクトを作成します。

実行するstaticなprivateメソッドの名前と、メソッドの引数をInvokeStaticメソッドに渡します。
InvokeStaticメソッドはobjectを返しますので、適切な型に変換します。

親クラスのメソッドをテストするには

親クラスのプライベートメソッドをテストする場合は、PrivateObjectの引数に親クラスを指定する必要があります。

たとえば、SubClassのオブジェクトを使って、親クラス(MyClass)のaddメソッドをテストする場合です。

public class MyClass
{
    private string greet(string name)
    {
    return "Hello " + name;
    }

    private static int add(int a, int b)
    {
    return a + b;
    }
}

public class SubClass : MyClass
{
}

次のようにSubClassのオブジェクトでjプライベートメソッドを実行しようとするとMissingMethodException例外が発生し、「見つからないメンバーにアクセスしようとしました。」というエラーになる。

[TestMethod]
public void TestSubAdd()
{
  var subClass = new SubClass();
  var pbObj = new PrivateObject(subClass);
  var actual = (string)pbObj.Invoke("greet", "World"); // MissingMethodException「見つからないメンバーにアクセスしようとしました。」
  Assert.AreEqual("Hello World", actual);
}

PrivateObjectの引数にテストしたいクラス(MyClass)を指定することで、テストできます。

[TestMethod]
public void TestSubAdd()
{
  var subClass = new SubClass();
  var pbObj = new PrivateObject(subClass);
  //var pbObj = new PrivateObject(subClass, knew PrivateType(typeof(MyClass)));
  var actual = (string)pbObj.Invoke("greet", "World");
  Assert.AreEqual("Hello World", actual);
}

privateフィールドのテスト

privateフィールドの値を取得するには、PrivateObjectのGetField()メソッドを使用します。

public class MyClass
{
    private string name;
    public MyClass(string name)
    {
        this.name = name;
    }
}


[TestMethod]
public void TestNamet()
{
    var myClass = new MyClass("Hello World");
    var pbObj = new PrivateObject(myClass);
    var name = (string)pbObj.GetField("name");
    Assert.AreEqual("Hello World", name);
}

jupyter notebookにmatplotlibを使ってグラフを描画する

jupyter notebookにグラフを表示するためのおまじない

%matplotlib notebook

または

%matplotlib inline

notebookはグラフを操作できる。

inlineはグラフが画像になる。

グラフを書いてみる

%matplotlib notebook
# ライブラリの読み込み
import matplotlib.pyplot as plt
# グラフを描画する
plt.plot([1,2,3,4])

X軸、Y軸の値を指定する

%matplotlib notebook
import matplotlib.pyplot as plt
# X軸、Y軸の値を指定する
plt.plot([1,2,3,4], [2,4,6,8])

直線以外の描画

青円

plt.plot([1,2,3,4], [2,4,6,8], 'bo')

赤い下向き三角

plt.plot([1,2,3,4], [2,4,6,8], 'rv')

指定できる文字列は「Matplotlib documentation」を参照。

plt.plot([1,2,3,4], [2,4,6,8], 'bo')
plt.plot([1,2,3,4], [4,3,2,1], 'rv')
plt.plot([1,2,3,4], [7,7,7,7], 'g*')
plt.plot([1,2,3,4], [6,6,6,6], 'mp')

グラフにラベルをつける

%matplotlib notebook
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])

# X軸のラベル
plt.xlabel('X Label')
# Y軸のラベル
plt.ylabel('Y Label')

軸の設定

X軸Y軸の範囲を指定する

%matplotlib notebook
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.xlabel('X Label')
plt.ylabel('Y Label')

plt.axis([1,5,1,8])

axisの引数は、[X軸最小値, X軸最大値, Y軸最小値, Y軸最大値]となる。

X軸Y軸を表示しない

plt.axis('off')

他にも、’equal’,’scaled’,’tight’,’image’などの設定がある。

関数を描画

%matplotlib notebook
import matplotlib.pyplot as plt
import numpy

def sigmoid(x):
    return 1 / (1 + numpy.exp(-x))

x = numpy.arange(-5, 5, 0.1)
plt.plot(x, sigmoid(x))

MathJaxを使って数式を表示する

MathJaxを使って数式を表示する

LaTeXで数式を記述し、MathJaxを使って表示します。

LaTeXを使うには

MathJaxのスクリプトをロードするタグを追加します。

<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"></script>

数式を記述する

数式は、LaTeXという記法で記述します。

LaTeXがわからなくても、数式エディタを使えば簡単にできます。

手書きで数式を入力すると、LaTeX記法に変換してくれます。

このように書いたら、

このように認識されて、

このようにLaTeX記法に変換してくれました。

数式を表示するときは、数式の前後を「\
(」「\
)」で囲みます。

\( z=\dfrac {1} {1+e^{-u}} \)

WordPressではこのように表示されます。

\( z=\dfrac {1} {1+e^{-u}} \)

VMWare PlayerにインストールしたLinux MintにVMWare-Toolsをインストールする

Linux Mintをインストールした後、パッケージリストを更新する

sudo apt-get update

VMWare PlayerのVMWare Toolsではなく、open-vm-tools-desktopをインストールする。

sudo apt-get install open-vm-tools-desktop

インストールが終わったら再起動する

reboot

以上。