テスト対象プロジェクトのコンテンツファイルが必要なテスト実行時の注意

要約 テスト対象プロジェクトのコンテンツファイルが存在することが必要となるテストを行う場合は、テストクラスに[DeploymentItem(@"Files\contents.xlsx", "Files")]の記述が必要 内容 Targetプロジェクトにて、Files\contents.xlsxをコンテンツ指定しており、これを利用する機能をTargetTestプロジェクトから実行する場合、何も考えずに実行するとFiles\contents.xlsxが見つからない旨のエラー(File or Directory Not found)が出る。 で、そのあとにテスト単体を個別に実行するとうまくいく。[選択して実行]と[すべてを実行]では実行パスが違い、前者では何も指定しなくてもコンテンツもコピーされるが、後者ではされないためのようだ。 [http://blog.livedoor.jp/nanoris/archives/51825230.html:embed:cite] 対応としては、TestClassのアノテーションの下にDeploymentItemのアノテーションを追加するとうまくいった。 [TestClass] [DeploymentItem(@"Files\contents.xlsx", "Files")]` public class TestClass{ ... ディレクトリ「Files」も指定しないとDirectoryNotFoundExceptionとなった。コンテンツファイルをテストプロジェクトにコピーする必要はない。

<span title='2020-06-18 01:00:00 +0900 +0900'>June 18, 2020</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

MSTest の実行順番

要約 MSTestは、複数クラスのメソッドを交互に実行しうる。これが困る場合は1つのクラスにまとめるべきかもしれない 内容 テストクラスAで更新系のテストをまとめてクラス初期化時にデータ整備を行い、テストクラスBで参照系のテストをまとめてテスト実行時にデータ整備を行っていた。 MSTestでは標準で並列実行はしないので問題ないと思っていたが、タイミングによって参照系のテストがこけることがあった。よくよく調べてみると、参照系のテストの一部が終わった状態で更新系のテストに移り、そこでデータが更新されてしまった状態で残りの参照系のテストが行われ、データが合わない状態だった。 並列実行しないというのはメソッド単位の話で、クラス単位のメソッドの実行順位が入れ子になることはあるようだ。成功したり、失敗したりするヤなパターンとなる。 対応として参照系、更新系を同一クラスにまとめ、全メソッドに対してメソッド実行時にデータ整備を行うこととした。 参照系のテストのみであればデータ整備はクラス初期化時でよいのだが、更新系が混ざる場合は参照系を含む全メソッドでメソッド実行時にデータ整備を行わないといけないということか。

<span title='2020-06-18 00:00:00 +0900 +0900'>June 18, 2020</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

USB2,3のポート

要約 USB機器がうまく動作しない場合、特にそれがUSB2.0の機器の場合はPCにUSB2.0のポート(端子が青色でないもの)に挿すと正常に動作することがある。 内容 PCに接続するUSB機器が正常に動作しない事象が立て続けに起こった。 USB接続スピーカー(品番失念) たまに認識しなくなり、OS再起動したり別のポートに挿すと認識したり、それでもしなかったり… mouse computerの これらを、PCの仕様書からUSB2.0となっているポートに挿したところ、安定して動作するようになった。 どうも、PCのUSB3.0のポートはUSB2.0と完全に互換性があるとは限らないらしい。 http://www.akatsuki-lab.co.jp/Attention-USB3.0port.htm 検索してもUSB3.0(以降)はUSB2.0との互換性があり、かつ転送速度が速い、という記事しかないので、逆になんでUSB2.0がいまだに残っているのだろうと思っていたが、実際にUSB2.0のポートでないと動作しない機器があるということであれば納得がいく。

<span title='2020-06-16 00:00:00 +0900 +0900'>June 16, 2020</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

DataGridViewの列の並び順

Windows FormのDataGridView .Net Framework 4.7.2 にて DataGridViewでDataSourceにDataTableを代入して利用する。 dataGridView1.DataSource = dt1; 1回目に列名2020/1,2020/2,2020/3,2020/4 の4つの列名を含むDataTableを設定。その後2019/10,2019/11,2019/12,2020/1 の4つを列名に含むDataTableを渡すと、重複する2020/1が 先頭に表示されてしまう。DataSource自体は全く別のオブジェクトなのだが、DataGridView側で前回のColumn情報を覚えていて、列名がマッチしたら使いまわしているのかもしれない。 対策としては、DataSourceに代入する前に dtaGridView1.Columns.Clear(); を実行すればよい。

<span title='2020-06-08 00:00:00 +0900 +0900'>June 8, 2020</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

MariaDBのWindow関数

MariaDB: 10.4.12 にて 要約 MariaDB 10.4.12(2020/6/3時点で最新版の1マイナーバージョンだけ前)では、Window関数は ONLY_FULL_GROUP_BY で誤動作する。 内容 MariaDBでROW_NUMBER(), SUM() OVER() 等のWindow関数を使用すると以下のようなエラーが出る。 MySql.Data.MySqlClient.MySqlException: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause Window関数に使用している列をGROUP BYに指定して支障がないところであればそれでクリアできるのだが、そうでないところはどうにもならない。 Window関数自体は10.2から有効なはずなのだが、以下の記事によると、AVGなど一部のWindow関数以外はONLY_FULL_GROUP_BY に対応していないらしい。 https://jira.mariadb.org/browse/MDEV-17785 実際、AVG関数はONLY_FULL_GROUP_BY 制約のもと、GROUP BYで指定しなくても問題なく動作する。ROW_NUMBER(), SUM() はダメ。早く対応してほしい…

<span title='2020-06-03 00:00:00 +0900 +0900'>June 3, 2020</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41