このテストは何の誤りを検出できるのかしら?
やりたいこと
所得調整控除算出関数の作成
引数は収入のみ
収入が850万円未満
→所得調整控除=0円
収入が850万円以上1000万円未満
→所得調整控除=(収入-850万円)×10% 円未満切上
収入が1000万円以上
→所得調整控除=15万円
たったの三分岐である。さて、収入のテストパターンをいかがしたものか?
単純に境界値の
8499999
8500000
9999999
10000000
でいいのか?
テストケースどうしよう?
「年調給与額」から「給与所得控除後の給与等の金額」を算出するメソッドを書いている。
計算式は下表のとおりである。円未満は切り捨てることになっている。
年調給与額が下表の範囲外になることはないものとする。
メソッド自体は簡単に書けそうである。(C#ぽい何か)
decimal Hoge(decimal A){
if(A<=550999) return 0;
if(A<=1618999) return A-550000;
if(A<=1619999) return Math.Floor(A*0.6+97600);
・・・
}
みたいな感じ。
で、このメソッドのテストを書くにあたって境界値のケースを用意した。
A=1 (expected=0)
A=550999 (expected=0)
A=551000 (expected=1000)
A=1618999 (expected=1068999)
A=1619000 (expected=1069000)
A=1619999 (expected=1069599)
A=1620000 (expected=1070000)
・・・
うん、動く。この程度で失敗する心配はない。
ここでうっかりメソッド本体を書き換えてみる
decimal Hoge(decimal A){
if(A<=550999) return 0;
if(A<=1618990) return A-550000;
if(A<=1619999) return Math.Floor(A*0.6+97600);
・・・
}
一つ書き換えただけである。
これで1618999のケースが失敗するはz・・・あれ成功した?
それもそのはず
(正計算式)1618999-550000=1068999
(誤計算式)1618999*0.6+97600=1068999.4→円未満切り捨て→1068999
と、同じ値を返してしまうのである。
前後の計算式を取り違えた場合に失敗になるようなケースを追加しないといけない。
1618998だとどうだろ?
(正計算式)1618998-550000=1068998
(誤計算式)1618998*0.6+97600=1068998.8→円未満切り捨て→1068998
だめだ同じ値。
1618997だとどうだろ?
(正計算式)1618997-550000=1068997
(誤計算式)1618997*0.6+97600=1068998.2→円未満切り捨て→1068998
よし、ここだ。
A=1618997 (expected=1068997)
のケースを追加。
テストケースを探すのもしんどい。
メモ AutoItで画像認識
OS Win10Pro(64bit)
AutoItのFull Instrationをダウンロードしてインストール(x86のほう)
Visual Studio 2019 Community のインストール(C++のやつ)
https://github.com/MyBotRun/Libraries のをダウンロードして展開
上で展開したファイルにつき
ImageSearchDLL.slnがあるフォルダ(ImageSearchDLLフォルダ)をC:\にコピー
ImageSearch.au3をAutoIt3のIncludeフォルダにコピー
C:\ImageSearchDLL\ImageSearchDLL.slnをVS2019で開く
アップグレードメッセージが出るので従う
レッツコンパイルで出来上がるC:\ImageSearchDLL\Release\ImageSearchDLL.dllをC:\Windowsフォルダにコピー
で、ダブルクリックしたい画像ファイルを作成して同じフォルダにスクリプト書き書き
#include <ImageSearch.au3>
$x=0
$y=0
$result = _ImageSearch(@ScriptDir & "\" & "test.png",1,$x,$y,0)
if $result = 1 Then
MouseClick("Primary",$x,$y,2)
EndIf
実行するとめでたくダブルクリックしてくれましたとさ。
雑多なメモおしまい。
AutoIt by VisualStudioCode C#
かっこいいタイトルつけたけど中身はどろくさいです。
C#でAutoItを使うコードをVisualStudioCode( not VisualStudio )で書いて実行させましょうということでございます。
①Visual Studio Codeのコンソールでdotnet new console -o [プロジェクト名]
例:dotnet new console -o AutoItByCSharp
②プロジェクトのフォルダのbin\Debug\netcoreapp3.0(一度ビルドしないと作成されない)にAutoItX3.Assembly.dllとAutoItX3_x64.dllをコピペ
③.csprojファイルのProjectタグの下に以下のようにItemGroupタグを追加
例:AutoItByCSharp.csprojに赤字部分追加
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Reference Include="AutoItX3.Assembly">
<HintPath>C:\Program Files (x86)\AutoIt3\AutoItX\AutoItX3.Assembly.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
④Program.csにAutoItを使ったコードを書いてみるみる
⑤[F5]で実行するなり
AutoItXを動かすまで
個人メモ
よんどころなき事情にてAutoItでスクリプトを書いている。
付属のSciTE Script Editorは全角文字の対応が怪しい。
・新規作成したファイルに全角文字を入力しようとすると文字化け
・ConsoleWriteで全角文字を出力すると文字化け
VSCodeのExtentionでAutoItのがあったのでそっちで入力した
・VSCodeから実行はできなかったので実行はSciTE Script Editorでやることにした
この後ひたすらAutoItのスクリプトを書いて所期の目的はなんとか達成できた。
んが、今後AutoItのスクリプトを保守していくにあたり
・VSCodeから実行できない
・スクリプトでClassが使えない
・AutoItの文法を他の人に学んでもらわないと保守できるのが私しかいない
というのは今後のことを考えると若干困ったなと。
C#からAutoIt動かせねーの?とググったらAutoItにAutoItXというのが付属していたことが判明。COMとかいうらしいのだがなんかdllを参照したりコピーしたら動いたので手順書いておく。
①VisualStudioでC#のConsoleプロジェクトを作る
②C:\Program Files (x86)\AutoIt3\AutoItX\AutoItX3.Assembly.dllを参照追加
③Mainメソッドに適当にスクリプトを入れる
例)AutoIt.AutoItX.Run("notepad.exe", "");
④プロジェクトのbin\DebugフォルダにC:\Program Files (x86)\AutoIt3\AutoItX\AutoItX3.dllをコピー
で、AutoItのスクリプトでやれることがC#でできそうな感じである。
AutoItやってみた。
AutoItてのがあります。
何をするのかはググればすぐ見つかることですが、ざっくりいうとマウスやらキー操作の手順(スクリプト)を書いたら手順どおりにマウスやらキー操作をしてくださるありがたいものです。
弊現場にて開発中のソフトの動作確認を要求されているのですが、これが結構めんどくさいし同じことの繰り返しでイラッとするので自動化してみようと思って導入した次第です。
まずはAutoItをインストロールしないことには始まりません。
あ、以下、PCの環境は以下
・OS:Windows10 日本語のやつ。
・VisualStudioCodeインストール済
ではAutoItのインストール開始。
↑の
"AutoIt Full Installation. Includes x86 and x64 components, and:"
をDownloadして馬鹿インストール(インストールウィザードにひたすら[OK])
インストールしたらば、AutoItに付属のエディタでスクリプトを入力・・・と思ったのですが、こいつが日本語対応できてない。
しかたなくスクリプトの入力にはVisualStudioCodeを使う。AutoIt用の拡張があるのでインストールよろしくです。で、スクリプトを入力。
スクリプトを入力したら即実行[F5]・・・
あら動かないわ。なんかメッセージ書いてあるけど気にしない。AutoItに付属のエディタで開きなおす。
で、ここから[F5]で無事にスクリプトを起動することができました\(^o^)/
VisualStudioCodeで編集&保存→AutoIt付属のエディタで[F5]という見事(?)な連携である。
ちなみに上のスクリプトは
「メモ帳を起動してHello,Worldと入力しマイドキュメントのHello,World.txtに保存する」
というものです(※マイドキュメントにHello,World.txtがすでにある場合は上書確認で止まってしまいます)。
本来の目的である開発中のソフトの動作確認の自動化はもうちょっとマシなスクリプトを書き上げれば達成・・・ということになります(※実物はモロにソフトの名称が入っているので公開できまへん)。
VisualStudioCodeで編集・gitで管理という環境にしておけばスクリプト改善が安心して行えます。頑張って自動化をめざすぞい・・・
<顛末>
スクリプト書くよりも、自分の手で動作確認したほうが早かった。
AutoItに慣れてないもんね。仕方ないか。また次回チャレンジだわ。
Visual Studio 2010 to Visual Studio 2019(続き)
の、続き。
VS2010で識別子(変数名・プロパティ名・メソッド名など)に’・'(カタカナ中点)を使ってるとそのままではVS2019ではビルドエラーになるので、エラーになる箇所を一つずつ変更していくか。かったりーなー・・・・とツイッタランドで呟いてたら
ビルド可能なバージョンでビルドしたアセンブリからシンボル名を抜き出して、それを使ってソースコードの一括置換したらどうですか?
— Kouji Matsui (@kekyo2) May 20, 2019
などという啓示が。ツイッタランドには神がいた。
ブログ主が理解浅きゆえに
そんなど素人に高度なことをorz
— たーぼぉ (@turkey_pc) May 20, 2019
ビルドしたファイルの中に元の変数名が仕込まれてるってことですか?
シンボル名ちょっとググって勉強しますm(_ _)m
などと呟こうものなら、
ちょっと考えてみました。引数にアセンブリへのパスを指定すると、type, field, property, event, methodの名前(名前空間を除く)で抽出してcsvで出します。途中のwhereで"・"を絞り込んでいるのをやめて、全部出してからエディタで加工しても良いかも知れません https://t.co/WDkeP8BzOJ
— Kouji Matsui (@kekyo2) May 20, 2019
さっさと神自ら解決の道具までおつくり下さいました(かんしゃー
神の作りし道具に弊現場で使われているアセンブリを全部投げ込めばカタカナ中点を使っている識別子を網羅してくれるので、ソースコード中の該当箇所を文字列置換してしまえばOK・・・と。
ちょっと見えてきた。