Unity Editor上で非同期テストしたいからMiyamasuっての作った


概要

5.3からテストユニット入ってたのガン無視してテストツール自作してた。


理由はまあCoreCLRでも動く非同期/同期待ちを頑張ったやつが使いたかったからなんだけど、

Unity5.3から標準でNUnit入ってるんでじゃあどっちでも使えば良いじゃんってなってやっと手をつけた。


んだけど、今組み込まれてるテストツールでも単体だとまだ非同期のテスト書けねえのな、、がっかり。


結局自作したテストツール整備してたら公開できる感じになったのでそんだけ。


エディタでだけでもasync使えれば

って思ってたんだけどまだダメみたいだな、、まあいいや。


というわけで、アノテーション書けば適当に依存なしでUnityからCoreCLRまで一貫して動く自作してたやつを書いた。

Annotation絡みの実装を一回やってみたかったっていうのもある。

急いで作って急いで使って、Editorでasyncが書けるようになったら捨てる。

Miyamasu

https://github.com/sassembla/Miyamasu


次のようなコードで非同期の結果を待てる


[MTest] public void SampleSuccessAsync () {

var done = false;


/*

the sample case which method own their thread and done with asynchronously.

*/

{

var endPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 80);


var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

var connectArgs = new SocketAsyncEventArgs();

connectArgs.AcceptSocket = socket;

connectArgs.RemoteEndPoint = endPoint;

connectArgs.Completed += new EventHandler<SocketAsyncEventArgs>(

(obj, args) => {

// failed or succeded, done will be true.

done = true;

}

);


// next Async operation will be done really soon in async.

socket.ConnectAsync(connectArgs);

}


        /*

wait while 1st parameter "Func<bool> isCompleted" returns true.

in this case, "done" flag become true when async operation is done.


2nd parameter "1" means waiting 1 seconds.

        */ 

      WaitUntil(

() => done, 

1

);

}

WaitUntil(Action<bool> waitFor, int waitSeconds)行が面白いところで、この行で条件付きの待ちを行っている。

この時の条件は、doneがtrueになるまで1秒間待つ、というもの。



MainThreadでしか実行できない要素をテスト

こんな感じに書ける。

[MTest] public void SampleSuccessAsyncOnMainThread () {

var dataPath = string.Empty;


/*

sometimes we should test the method which can only run in Unity's MainThread.

this async operation will be running in Unity's Main Thread.

*/

Action onMainThread = () => {

dataPath = UnityEngine.Application.dataPath;// this code is only available Unity's MainThread.

};


RunOnMainThread(onMainThread);


/*

wait until "dataPath" is not null or empty.

*/ 

WaitUntil(() => !string.IsNullOrEmpty(dataPath), 1);

}


RunOnMainThread(Action)っていうメソッドで、特定のコードを特定の順でほぼMainThread(実際にはUnityEditorのupdate)で実行できる。

上のテストは、Action onMainThreadをMainThreadで実行し、その実行が終わるまでの間、WaitUntilで待つ。



画像は最近宮益坂にできたコメダの宮益坂 ミックスサンド

名前に悩んでたらちょうどこれ食ってたのでMiyamasuにした。

IMG_1646.JPG


美味しいが馬鹿でかい。

写ってる部分で全体の半分くらい。


2人分くらいある。これで770円は安い、、、