「ホワイトボックステスト」を含む日記 RSS

はてなキーワード: ホワイトボックステストとは

2020-12-23

anond:20201221231321

計算ロジックが複雑かつ特定オブジェクトに密に関わっている場合、元記事に引かれている例でいえば麻雀の点数計算のようなものとかあるいは準数値演算や組み合わせアルゴリズムが関わってくるようなメソッドだと、振る舞いを見るブラックボックステストではなく、ロジックを調べるホワイトボックステスト必要になる。

そういう場合、たとえ別モジュールに切り出してもテストしたい部分の複雑さは変わらず、やっぱりプライベートの部分をテストしたいということになる。

モジュールに分ければプライベートメソッドテストする必要はないはずだという想定は、プライベートメソッドテストができない言語テストライブラリの欠陥に対する言い逃れじゃない?

2020-12-20

プライベートメソッドテストすべきか

「すべきでない」というのがたぶん多数派

テストすべきでない理由としてだいたい次の理由があげられる。

プライベートメソッド関数テストする必要は無いと考えていますプライベートメソッドは、実装の詳細であるからです。

多くの場合、そのクラスパブリックメソッド経由でプライベートメソッドテストも同時に行えます

プライベートメソッドのテストは書かないもの? - t-wadaのブログ

ほとんどの場合プライベート メソッドテストする必要はありません。 プライベート メソッド実装の詳細です。

プライベート メソッドがある場合は、パブリック メソッドを見つけて、そのメソッドに対してテスト記述します。

単体テストを記述するためのベスト プラクティス - .NET | Microsoft Docs

プライベートメソッドテストするな」と強く主張されるのは、ケント・ベックの影響もあるかもしれない。

例えばtwitterで、パブリックメソッドにだけテストを書き、テスト必要なほどプライベートメソッドが複雑ならそれを別のオブジェクトに切り出す必要があると発言している(twitter/kentbeck)ように、プライベートメソッドテストに強く反対している。

またベックの書いたSUnit(xUnitの源流にあたる)には「ひとつテストひとつオブジェクトで表し、それによってテスト独立性を高める」というアイディアが使われている(そのアイディアを実現するためにとても複雑な設計をしている Simple Smalltalk Testing: With Patterns)。テスト自身ひとつオブジェクトとして独立しているなら、テスト対象となるオブジェクトプライベートメソッドテストできないのは当然のことになる。

しかし「プライベートメソッドテストがしたい(したくなることがある)」と感じる人も相当数いる。

そう感じる人にとってはむしろここからが本題で、

問題になる。

テストファーストで開発するなら手を動かしながら軽い気持ちで書きたい。

例えそのクラスがprivateメソッド依存関係があっても。

コンストラクタインジェクションされたクラスのprivate メソッドでもテストファーストしたい - Qiita

privateなルーチンの自動テストは面倒だ。実際にコーディングするとき最初publicにしておいてテストしてうまく動いていそうならprivateにするのだけど、この「いそう」がくせ者。いっそのことすべてpublicにしたくなる。

私は元々メソッドはprivateにしない主義なのでメソッド場合問題ないのだけれど、ファイル内の「関数」が問題になる。和了計算だと和了形判定とか符計算とか和了役判定とか単体でテストしたい内部関数が山ほどある。(twitter/koba0367)

private メソッドテストすべきか問題原則論だけだと袋小路に入りがちだから、private メソッドテストしたくなる具体的な場面について議論したほうがいいと思う。

自分レビューでよく見る例としては、複数の public メソッドの重複部分を private メソッド抽出した結果、濃い private メソッドと薄い public メソッドが一対多関係になる場合が挙げられる。設計としては間違っていないし、わざわざ public メソッド経由でテストする意義があるかというと微妙。(twitter/ts7i)

きれいなインターフェースを作ろうとすればするほどpublicメソッドじゃない部分に複雑性を追いやることになり、壊れた時に手戻りが大きすぎると思ったら、プライベートバックドア開けてでもテスト書くようにしてます (twitter/mizchi)

しかプライベートメソッドに対するテストを書こうとすると大概リフレクションなどで可視性の制限をすり抜けるとかメソッド可視性を変更するといった回りくどさやコストの導入が必要になるので、じゃあプライベートに対するテストはそうしたコストに見合うのかが問題になる。

伊藤さんの答えは「原則書かないほうがいいという大前提のうえで、どうしてもというときは、"これはテストのためにpublic"にしているというコメントの上でpublicにする」だった。

自分は「テスタビリティのためにメソッドをpublicにする」っていう"実プログラム挙動を変えること"の方が、「privateなメソッドテストコードのみsendで叩く」よりも怖いって思ってることに気がついた。(twitter/highwide)


メソッドプライベートパブリックかという話とそれをテストするかどうかは別問題だろという意見もある。

単体テストホワイトボックステストだとするなら、publicかprivateかでテストの有無が変わるのは明らかにおかしいだろ。ややこしいロジックはprivateに隠蔽すべきだが、そこがテストできないなんて。 (twitter/kmaebashi)

private メソッドテストするかどうか? まず最初に言っておきたいのは public/private は抽象設計問題であって、テストすべきかどうかとは当然無関係だろうということ。(twitter/qeigoi)

特定言語の貧弱な機能思考制限を受けて誤った結論を出している典型的な例。

"テストを書くべき"と"上位層から可視性"は直交する概念

https://b.hatena.ne.jp/entry/4684049296462116226/comment/megumin1

テスト粒度メソッドアクセス権は独立したものなので、「プライベートメソッドテストすべきか否か」という切り方自体ナンセンスではあるのだが、現実問題としてはアクセス権がテストに影響するので難しい。(twitter/AoiMoe)

private メソッドテストはすべきかどうかというより、「できるべき」であって、それができないというのも、ある種、言語機能テストインピーダンスミスマッチと言えるのではないだろうか、と思っている。(twitter/aetos382)


プライベートメソッドテストがしやす言語での意見

RustやGoではプライベートメソッドに対するテスト簡単にできる。

そのためかプライベートメソッドテストすることに対して拒否反応があまりないようだ。

Rustのテストファイル内とtests/以下の2箇所に書ける。

テストには開発用のホワイトボックステスト仕様確認用のブラックボックステストがあり、前者をファイル内に、後者をtests/に書けば良い。

例えば度々議論になるプライベート関数テストについてはもちろんホワイトボックステスト。(twitter/blackenedgold)

Rustではプライベートに対して何の手間もなくテストが書ける。

概念的にはプライベートに対するテストは外部コードではなく内部コードの一部として見るべきなのだろう。

Rust入門を兼ねてプロジェクト・オイラーの問題を解く - 再帰の反復blog

Rustでprivateなメソッドテストを書きたいなら、そのメソッドのすぐ隣に書けば内部アクセスになるから普通に書けるよ、ってのは目からウロコだった。できるだけ近いところにテストを書こうっていう文化と相まって最高。(twitter/kuy)

Rustみたいに単体テストは同ファイルに書ければいいのに

assertionチックにprivateメソッドのすぐ下にテスト書きたい

ドキュメントにもなるし (twitter/takaya_tim)

Rust のようにユニットテストプロダクションに混ぜる方式はおれもいいと思ってて、テストプロダクションを分離することで private 関数テストができない問題があるけど(テストしたければクラスを分けよ/メソッドを公開せよ/テスト必要なし、に分かれるよね)、そもそもこの議論不要になるよね (twitter/nunulk)


go言語だとプライベートメソッドテスト普通にやりますね。(twitter/mattn_jp)

昨日「private method の単体テストは書くか否か」という話題がちょいとあったのだが、わしは当然書く感じの昨今を送ってきたもんで何で書かんのやくらいに思ってたんだけど、Go だと private なやつのテストが書きやすいってのがデカそう。(twitter/pankona)

golangのテスト書いてたけど、テストプログラム名前空間(パッケージ)が、対象プログラムと一緒で、そのためプライベートメソッドでもテストできるの良い感じ (twitter/74th)

Goテストコードテスト対象と同じパッケージにすればエクスポートしてない関数でもなんでもテストコードから参照できるんだけど、これってプライベートメソッドテストすべきか議論するよりテスト書けと言われているようで好き。(twitter/plan9user)

プライベートメソッドテストするか?」とは別にドキュメントソースコードと同じファイルに書いていい(文芸プログラミング)なら、単体テストテスト対象と同じファイルに書いてもいいのでは?」というのも論点になるかもしれない。

2018-04-26

データサイエンティストが働いて嫌だったなと思う人たち

コンサルにてアナリストをやった後、データサイエンティストを名乗りながら仕事をしています。そんな中で嫌だったなと思った人たちとプロジェクト

1.医療統計の周りの人

最近アウトカムでの評価の流れにはなってきたが、まだまだモデル評価をする事は少ない。

でも何故か相変わらずロジステックとCox回帰をやれればおっけーであり、モデルの精度が当たらなくてもオッズ比と説明変数

有意差だけでていれば上手く行く分野。 本当に心が痛む上、まだまだ「医者でなければ人であらず」が通ってしまい、モデル説明よりもお医者様のお言葉が1stにきてしまう。また分析プロジェクト

設計らしい設計があまり出来ないのもつらいところ(モデルの精度が出ていないのにそのオッズ比・有意差に何の意味があるんだと思う)。後日本の製薬企業から「何とか工夫で有意差がでないのか!!」

という謎おしかりを受ける・・・いやそんなん無理ですやんと切実に思う。やる気でこの世界数字は変わりません。

後は何だかんだ製薬企業日本の古いしきたりが多いので面倒。

2.Google Analyticsアナリスト関連

割と良いBIみたいなんが良くも悪くもあるためアナリストの人たちがやった気になっているやつ。Web関係アナリストは、アナリストを名乗って欲しくない人の方が多いイメージ(勿論しっかりWebアナリストやっている方々は知っている)。広告内容を分類し、CV予測、そしてマルチチャネル予算からCV最適化案件をしていたらWebアナリストから「私の作るLPは最適です。なので予算4000万です」という謎の最適の主張を受けたのはいい思い出(何故かデザイナー様がWebアナリストもやっていた)。広告内容のuser2vecでのレコメンド実装チャレンジして評価して、協調フィルタリングよりも精度はよさげだな喜んでいたら、どっかのよくわからないレコメンドツールというのが汎用性もあるし、既存ツールに1万ぐらい払えば追加できるとそして何故か「最適化」されているという言葉役員が騙されて決済がおりていたのを聞いたとき殺意が沸いた。どうせ既存マーケティングオートメーションレコメンドエンジンなんて協調フィルタリング・ロジぐらいだろうと思っている。本気で分析やっている人がそうそ最適化なんて言葉を使わないと思うんだ・・・まぁここの反省Web業界といってもみんなコーディングがりがりではなくてGUIでいいならそれでが割と多いという事を学んだ (注意)。

3.データベース関連

どっかの人のにもあったが、「あっ、データ分析分かるんだよね?」という事でVB6Accessの改修をやらされそうになったときは全力で拒否った。

後は何故かPHP+MySQLあん(ry

VB6見た後でPythonコードを見ると心が癒された。

4.やる気を説いて来る人達

やる気で数字が変わったら誰も苦労なんてしないんだよ・・・。半教師有り等で精度向上見込めるといってもいくらなんでもこのデータでは

運用目標には到達しないとしか思えないんだ。

5.ホワイトボックステスト要求されたとき

モデルホワイトボックステストってどうやってやるんだ?精度を検証データでやっていれば良いじゃないかと思っていた。ただそこの金融系でITプロジェクトは、基本的に「ホワイトボックステスト」やらが必須らしく・・・おいおい・・。とりあえずカテゴリー目的変数がそれぞれの値を取ることを客先で見せてかつレポートで「こうこうこうゆうときカテゴリー変数が変わりますよ」という彼らがいう境界線確認を全てやることになった。カバレッジ100%も言われたが、流石に無さ過ぎるので諦めてもらった。

6.KGIとKPIしっかり切り分けてBI作成していたら集計屋かといって来られる時

どこかの人にもあったが、私はビジネスが動けばよいと思っているので難しい分析をしなくても上手く行く時は、集計で上手く切り分けて、要因分析をやる(裏で決定木とかで境界値とかは見ていたりする)。ただ何故かそれで集計ばかりしかしていないと怒られる。別に研究者ではないし、難しい分析をしてクライアントへの説明時間を取られたり、展開が難しくなるぐらいならば皆と合意した上で、KPIとKGIを切り分けてダッシュボード作成をしっかり出来る方が実はビジネス上上手く行くだ。むしろ自分への戒めでいつも難しい分析が本当に必要なのかと思ってるぐらいである。

注意 因みに私の別部署インフラ基盤周りのWordpress関係炎上していた。そこそこの大規模でWordpress使うって大変らしいのに・・・

勿論これの逆、評価した上で、分析ビジネスにしっかりと生かしていける人は大好きです。

2016-09-28

ホワイトボックステストブラックボックステスト

彼ら自身自分が何をしているか分かっていない。

私にとって身近な存在になるほど単盲検に限りなく近い。

2016-06-19

全てのRubyエンジニアはだいたい糞である

汎用系のエンジニアからRubyエンジニアとして転職して1年。

コボラー(笑)なんて言われることも多いが、この1年で出会ったRubyエンジニアは全て糞だった。

その特徴はだいたいこの3つだ。

1.テストを甘く見ている

やれテスト自動化だ、やれテスト駆動開発だの口だけ達者なエンジニアの多いこと。

そもそもブラックボックステストホワイトボックステストを分かっていない奴が多すぎ。

テストコードカバレージが100%だったとしても実際の打鍵結果でエラーは弾けることが多いのにリリースしてしまう。

そもそもテストケース表を若いうちに書く習慣が無いからだ。

ドキュメント揶揄し机上デバッグも行わない、こんな状態で「アジャイルですから」とかドヤ顔でいってしまRubyエンジニアは糞である

2.パフォーマンスを考えない

Rubyエンジニアパフォーマンスを考えない。

どのメソッドがどれくらいの負荷なのか意識せず実装を行う。

便利だから、ただそれだけの理由なのである

そもそも自分が行おうとしているソートが何ソートなのか知っているのか?計算回数を考慮した上での実装か?

便利なメソッドがたくさんあるのは知っている。

ただ、中身くらいは知っておこうよ。

eachで回してばかりだから複雑なループ対応もできない。

新人に教えたらバカにされたけど、まずフローチャート書くようにしようぜ。

3.外部ライブラリに対する絶対的根拠の無い信頼

Gemに対する絶対的な信頼感、あれなんなの?

Githubで公開されてましたんで導入しました」じゃねーよ。

結局他のGemバッティングしているじゃねーか。

得体の知れないコードをたくさん詰め込んだプログラムをよく動かせるな。

そんで都合の悪いところだけコードを読んでオーバーライドする。

影響範囲を全く調査せず、Gem絶対神話を唱える。あれなんなの?



いや、Rubyが便利なのは認めるよ。俺だってPLIとかCOBOLより書いてて楽しいよ。

インデント合わなくてコンパイルエラーとかないしな。

でもあまりにもRubyエンジニア糞すぎだろ。

エンジニアもどき量産言語だね。どれか1つでも当てはまった奴は小学校からやり直せ。

日本の将来が心配だわ。


追記

意見がたくさんもらえて喜ばしい。

文化の違いという意見もあったが、「よくわからないけどなんかうまくいく」コードだとデバッグも大変だし不具合も起きやすい。

それで納品するのはプロとしておかしい。

主語が大きい

「だいたい」とあるだろう。全てのだいたいだ。

フローチャート

ロジックを整理するツールとしては優秀。

精神論に聞こえるかもしれないが、フローチャート書いて育ったエンジニアは頭の中でロジックの組み立てと凡その演算回数が計算できるようになるよ。

カバレージが100%だったとしても実際の打鍵結果でエラーは弾ける

あー、ここは誤タイピングだわ。

自動テストカバレージ100%です、そして画面数回触ってリリースしますーっていう奴が多いってこった。

単体だけじゃなく画面使ったテストもケース表書いて網羅性を担保しないとダメだろ。

もちろん慣れて頭に入ってくれば勘所がわかるんだが、そんな属人的ものよりもケース表書くのが無難だろう。

2010-03-18

意外と工数がかかったプログラムホワイトボックステストをすると、

あまりコード自体の量は多くないことに気づく。

ほとんどが先方との調整、仕様変更工数がかかっていたことになる。

 
ログイン ユーザー登録
ようこそ ゲスト さん