Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CPPA::stdErrorのテストを追加するにあたっての課題共有 #1812

Closed

Conversation

berryzplus
Copy link
Contributor

PR の目的

タイトル通りです。

カテゴリ

  • 実験 (master へのマージを目的としない)

PR の背景

CPPA::stdErrorの単体テストを作ろうとしたら課題にブチ当たったので共有します。

PR のメリット

PR のデメリット (トレードオフとかあれば)

仕様・動作説明

CPPA::stdErrorPPA.DLL がエラー時に呼び出す「コールバック関数」です。

エラーコードとエラーメッセージを受け取り、
適切なメッセージを組み立てて「メッセージボックスに表示する」という仕様です。

「メッセージボックスに表示する」という処理は通常は「テスト不可」です。
メッセージボックスを表示するとスレッドがブロックされて先に進まなくなるためです。
実装した処理の正当性を確認できるようにするには、メッセージボックスを入れるべきでないです。
とは言え、既存コードのメッセージボックス表示を削って回るわけにもいかないので、
以前「メッセージボックスを表示するパスがあっても自動テストができる仕組み」を作り込みました。(#1362)

単体テストの一部として動く場合(正確には標準エラー出力が存在する場合)、
メッセージボックスに標準エラー出力(STDERR)に吐かれるようになっています。

CPPA::stdError は「Err_CD=0:PPAのエラー」時に「Err_Msg」をそのままメッセージボックスに表示します。
gtestは標準エラー出力(std::cerr)に吐かれた文字列をキャプチャできます。
#1362 の機構がちゃんと動いていれば、単体テストを作れるはずです。。。(要するに、動いてないんです。)

PR の影響範囲

テスト内容

テスト1

手順

関連 issue, PR

#1811
#1722
#1362

参考資料

https://gongo.hatenablog.com/entry/20110516/1305548031

@AppVeyorBot
Copy link

Build sakura 1.0.4065 failed (commit 866dfb2c3c by @berryzplus)

@AppVeyorBot
Copy link

Build sakura 1.0.4066 failed (commit ec4704f66f by @berryzplus)

@berryzplus
Copy link
Contributor Author

少し先走ってコミット積んでしまいました。
最初のコミットでは、テストが失敗します。
2つ目のコミットもテストは失敗するのですが「ハンドルが無効です。」という出力を得られます。

問題箇所はココです。

// lpText を標準エラー出力に書き出す
DWORD dwWritten = 0;
::WriteConsoleW( hStdErr, lpText, dwTextLen, &dwWritten, NULL );

Windows API WriteConsoleW関数はコンソール専用なので、hStdErr がコンソールハンドルでなかった場合「ハンドルが無効です。」というエラーを出します。gtestは標準エラー出力をキャプチャする際、プロセスのエラー出力をファイルハンドルに差し替えているため、ここの記述が「絶対に正しい」と仮定すれば「gtestは使えない」になります。「gtestを使って標準エラー出力をキャプチャするんだ!」を仕様と捉えると「コードが誤っている(≒バグじゃ~~~)」になります。

個人的に「テストがしづらいコード」はそれ自体不具合だと思うので「#1362 の不備」として修正したらよい気がします。アプリの挙動には影響しない不具合なので「不具合修正」にはならんのですが。。。

@AppVeyorBot
Copy link

@AppVeyorBot
Copy link

@berryzplus
Copy link
Contributor Author

Code Smells対策、これはちょっと難しいかも。。。

@sonarqubecloud
Copy link

SonarCloud Quality Gate failed.    Quality Gate failed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 2 Code Smells

77.8% 77.8% Coverage
0.0% 0.0% Duplication

@AppVeyorBot
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants