「ユニットテスト」を含む日記 RSS

はてなキーワード: ユニットテストとは

2024-02-25

[] 全部を書き直す必要はない

コードエントロピー機能追加によって増大する傾向にある。

「この関数にこういうパラメータを使ったこういう処理を追加してくれ」などと言われたら、コードは複雑化するのは当然だろう。

かといってこういう要求が来た時に、コード全体を一から作り直して簡潔にしようと思うのはナンセンスだ。

コードの量にもよるが、一定程度の量のコードがそこにあるときは、やはりリファクタリングの方が効率よく進められる。

「僕はリファクタリングなんてしませぇん、一から書いた方がいいでぇす」というのは、特定現場・状況だけにあてはまるものだと認識しておこう。

かにコード全体をリファクタリング」なんてしようと思ったら大変すぎるが、通常は「修正担当する部分をついでにリファクタリングする」でOKだ。

ユニットテストさえかけていれば、そのリファクタリングによって、バグが見つかりやすくなるだろうし、保守性も上がるのである

なお、本当にコードベースが酷いカオス状態で、ゴッドオブジェクトを使っているような状況になったら、「書き直す」という利点が少しはあるかもしれないが、そういう場合関係各位に同意を取らなければやってはいけない。

そういったカオスな状況でさえ、平均的なプログラマーは「良いコード」よりも「慣れているコード」に愛着を持つ傾向にある。

もしあなたが「コードを綺麗にするためにすべてを一から書き直そう」と、無断でそのようなことをやったら、彼らが慣れていないという理由批判の嵐が殺到するだろう。

もう一度言うが、最善の方法修正担当部分だけをついでにリファクタリングすることだ。これだけにとどめておけ。

2024-02-19

[] モジュール

コードを簡潔に保つにはモジュール化が必須であるしかし同じモジュール関係のない機能が含まれていたりすると混乱の元になる。

モジュール内の関数機能的関連性は凝集度という。

一方で、関数というのは引数の細かな仕様依存せずに、汎用的に呼び出せた方が何かと好都合だ。引数になんらかのオブジェクトを渡し、そのオブジェクトしか持ち得ないような特殊情報で処理を行なったりすると、関数オブジェクトが互いに依存しあってしまう。

これはモジュールの結合度と呼ぶ。

高い凝集度、低い結合度によってモジュールを作れば、保守性は上がる。

さらモジュール内では、公開する必要のない関数はprotectedまたはprivateにするべきだ。

そのためにはモジュールが公開すべき関数についてインターフェイスを作り、公開関数に対するユニットテストを書いておくのが良いだろう。

2024-01-07

anond:20240107204901

増田のチームは契約プログラミングデータ整合性チェック、トランザクション、条件網羅レベルユニットテストなどをすべてクリアしたシェルスクリプトプログラムを作っているということであっているかい?

まあそういうチームがいるのは知っているがかなり希少なエンジニアだと思うね。

大半のシェルスクリプトチームは対して技術力が無いのにシェルスクリプトを使ってて、度々障害を起こして仕事再生産している

anond:20240107202106

ワークフロー管理ツールからキックするのはPythonRuby場合によってはJavaとかの高級言語想定だね。

自分が想定してた許容できるシェルスクリプトコマンド呼び出すとか1行程度の物だね。

他に呼び出したいシェルコマンドとかがあるんであれば高級言語から呼び出したほうが良い。

多くの高級言語では契約プログラミングとかデータ整合性とかを検証するコードを書きやすいから、コマンドとかの出力結果を信頼できるデータとして後続処理に送ることができる。

(もちろんシェルスクリプトでも書けるが律儀にやっているとものすごいことになる)。

あと契約検証周りのコードプロダクションからもちろんテスト必要高級言語のほうが断然ユニットテストし易い。

2023-12-17

anond:20231216154938

コードの重複があるわけでもない状況で、コード関数ごとに分離するメリットデメリットを知りたいという話ですよね。

コードの重複がある場合関数などに切り分けていないと、同じコードを何度も書くことになり、不具合があった時にコピーされたすべての個所に変更が必要となるというデメリットがあるので理由がわかりやすいですが、重複が無いとその点が不明確ですね。

画面に収まらないサイズコード複数関数に分割するのが一般的だとは思います

理由元増田も書かれている通り、長いと理解の限度を超えるからです。

コード意味があるまとまりで短ければ短いほど理解がしやすいと思います

グローバル変数を使わないようにすると、入力・出力が関数を読むだけで明確にわかるので、さら理解がしやすいです。

また、関数に分けておけば、関数仕様通りに動くかの確認するユニットテスト簡単に書けます

ユニットテストでは関数さらにほかの関数を呼び出している場合、呼び出される関数の代わりにテストダブルを用意することもあります

分割して、複数関数を呼び出すようにすることのデメリットは、

下手糞が切り分けるとなんでそういう切り分けになったかからないところで切り分けられてかえって可読性が損なわれるとか、

関数機能拡張してより多く・あるいは少なくの情報必要な時に関数インタフェースの変更が必要になることとか、

関数を置いているファイル内の場所を変えたときバージョン管理システムが追っかけてくれないことがあるとか

くらいでしょうか。

いずれにせよ、分割するメリットの方がデメリットを上回ることが大半なので、大抵は機能ごとに分割して小さい関数を作り、それをメインからは呼ぶようにすると思います

以下、お悩みポイントに答えます

一番はメイン/サブ関数間で右往左往するので今やってる工程が何なのかがよくわからん

まず、関数名前をやっている工程を表すものにすることですね。

データの取り込み」 とか 「データ突合せ」とかを明示すると、それを呼んでいるということはそういうことをしてくれると思うので。

また、関数が何をしてくれるのかも関数コメントとしてつけておくとよいと思います

例えば、

filename引数指定されたファイルからデータを取り込み、JSONフォーマットで返す

引数: filename

返値: JSONフォーマットされた取り込まれデータ。例: [{'employee name': '山田 太郎', 'employee id': 1}]

例外: filenameを開けない場合はFileOpenError、JSONコンバートできなかった場合はConvertError

みたいなコメントをつけておくと何をする関数なのかわかるので、その機能を調べたいとき以外は読まないでいいかなと。

あと、コード連続で読みたい場合ソースを解析してタグジャンプをつけてくれるツールやらIDEやらを使うことが普通だと思います

あとは関数ごとに変数をいちいち定義し直すのがだるいみたいなのもありますね。

これはどういう意味でしょうか?同じものを表すのに関数ごとに別の変数名を付けているとか?

もしそうだとしたら、使っているプログラミング言語の制約やプログラミング規約によるものなのでしょうか?

ある関数ローカル変数が他の関数ローカル変数に影響を与えることは無いはずなので、ローカル変数は大抵適当名前が付けられるイメージです。

今時のプログラミング言語なら変数スコープ関数の中にとどまるような書き方ができると思うのですが。

関数インタフェース定義し、そこにいちいち引数を書くのが面倒というなら...まあ、それは必要税って感じがします。

そこに引数を書いておくことでこの関数が何に影響されるのかわかるので。

参考までに。

2023-07-05

anond:20230704231859

>こういうコードを通してしま人物に2,3人心当たりがある

まあ普通に俺のことだな。アマプログラマ職業プログラマ歴計30年だけど。

でも境界値とかはユニットテストで潰したい。レビューでのチェックは堪忍してほしいのだわ。

ユニットテストレビュー実施するべきなのかも知れない。

2023-04-26

SwiftUIに夢を見るべきじゃないのだろうか

「夢のような言語だ!」

 ↓

「MVVMはもう古い!時代TCAだ!」

 ↓

「いや待てよ、UI制御するロジックは外に出してユニットテストしたいじゃん…これってViewModel…」

 ↓

XMLか、それともSwift的な言語UI要素の構造を表すか、の違いはあるが、これってXAMLみたいなもの…」

 ↓

俺の運命いか!?

2022-07-03

anond:20220703004534

そういう記事主題って「Adapterパターンの使い方解説」でしょ

テストユニットテストを書いて自動実行できるようにしよう。だから既存クラス修正しよう。でFAだよね?

これは「新クラス作成時に既存クラスを流用したいがテスト工数は増やしたくない」ってテーマに対する回答でしょ

なんか間違った解説記事から間違った回答を導き出してて全然NGって感じです

adaptorパターンの使いどころがヤバい

既存クラスを変更するとそのクラスを利用している箇所すべてで修正必要になるからadapterごまかす!みたいな紹介を多々見かけた。既存クラステストもやり直さなくて済むし!とか。

ヤバない?

テストユニットテストを書いて自動実行できるようにしよう。だから既存クラス修正しよう。でFAだよね?

2021-09-14

webframeworkから解放されたい

総じて作法強要されてムカつくだけだしテスト対象なんて今日ユニットテストとE2Eで賄うからハンドラ部分の機能テストなんていらん

routingだけ提供してあとは黙っとけ

2021-08-01

素直に『わかりません』と言ってくれるプログラミングスクール出身エンジニア

最近案件自分メインで担当することが増えた。

自分仕事としては案件進めているうちに出てくる課題とか機能追加とかバグ修正とかを設計してIssueとして作って他の人に振ったり自分作業に当たったりと色々なんだけど、

最近とあるプログラミングスクール出身の同僚エンジニア(最近同じ部署になった)が自分案件アサインされた。



先日その同僚エンジニアとあるIssueを初めて振った。

内容としてはとあるテーブル特定カラムバリデーション処理が漏れいるから追加してもらって、なおかつユニットテスト修正する、というもの。まあ簡単な奴。

Issueを振ってからしばらくすると同僚エンジニアから質問が来た。

ユニットテスト実装方法がわかりません。」

「ん?」と思った。いや別に特殊ことなんて何もないIssueだし似たようなテストケースリポジトリ上に山程あるしどうにでもなるじゃんって。

まあ特に考えず1個のテストケースを例として自分で作ってみて、「残りは○○の場合とXXの場合と△△の場合テストケース網羅してください」みたいな返信をした。

しばらくするとまた質問が来た。「△△の場合テストケース実装方法がわかりません。」

いやいや、そんなん頭使ってどうにかこうにか考えろよって。案件特有ビジネスロジックのことを聞かれるならわかるけどこんなレベル対応どの企業のどの案件で振られても同じことやるだけやん。

この質問してるのが未経験入社1ヶ月目の新入社員なら自分笑顔で答えるけどこのエンジニアは俺よりキャリアが長いらしい。

その同僚エンジニアはわからないことがあるととにかく素直に「わかりません」と言ってくれる人だった。

成果物についても指摘事項があまりにも多く、自分(というかその人以外)がやったら10分くらいで終わる対応に数時間以上かけて説明して修正してもらうという感じになった。何のための仕事をしているのかよくわからくなっていた。


自分ITエンジニアが「わかりません」という言葉を使うのは例えばどうしても再現性がなくてログにも何も残ってない謎の不具合とか、コンパイラインタプリタレベル不具合で現時点で解消方法がどこにも載ってない奴とか、そういうマジで「参りました」的な状況だけかと思ってた。

こんな公式ドキュメントデバッグツールだけでどうにでもなる状況で「わかりません」を使う人に遭遇するのは初めてだった。



その人はとにかく「わかりません」が多い。

レビューの指摘の意味がわからない、指摘内容はわかっても修正方法がわからない、影響反映を洗い出してほしいと言ったら影響範囲の洗い出し方がわからないと言われる。何ならわかるのか教えてほしいくらいだった。

うっすら評判悪いのは知ってたけど実際に仕事してみると尋常じゃないほど酷かった。

こっちもいろいろ対策を考えた。

Issue振るときソース上に「↓ここの○○をXXになるよう修正してください」とコメントを書いてから仕事を振るようにする、「わかりません」が来そうな部分は先手で予想して回答を載せる。

でもダメだ。こちらの対策なんてものともしないように全てを掻い潜ってくる。

もはやその人に仕事を振るのは「この作業担当してくれたら助かる」ではなく「この作業であれば流石に”わかる”だろう、そして単純作業の量が多いからしばらくは邪魔されないだろう」という感じにできる限り疑問点が少なく時間がかかる作業で”遠ざける”のが目的になっていた。

最低でもあと1年くらいは人事はこの状況らしい。。。

こういう状況ってどう扱うのがいいんだろうなぁ。

2021-06-10

日本の古き良きIT企業退職して3年がたった

3年前、世間一般にはメーカーSIerとして知られている会社退職した。ただ俺のポジションパッケージソフト開発であり純粋SIerとは異なる。

客ともSEとも会話せず、ひたすらドキュメントプログラムを書く部署だ。といっても別にペーペーではなく主任クラスであり、

会社の業績がとてもよかったこともあり年収1000万弱はあった。35歳。

これだけ見るととてもいい待遇に見えるだろう。でも耐えられないことがいっぱいあった。

Linuxで動くアプリなのにVMを動かすのも苦労する8GBしかメモリのないWindows PC、紙にコード印刷して説明しないと納得しない品質保証部、

作業実施Excelにチェックを付けていくテストjquery一つ使うのに3ヶ月かかる承認フロー、開発中にバグを一つ出すごとに

ひたすら反省文を求める品質保証部と一緒になって詰めてくるマネージャー、常にコンパイルできないtrunk、

Java 5の時代から進化しないコード、使いにくい社内ミドルウェアの利用を強制される設計、開発期間の半分以上を占める最上設計

一旦書いたコードは消してはならずコメントアウトしないといけないコーディング規約など、数を上げればきりがない。

色々改善活動を頑張ったものの、結局Subversionの導入も品質保証部がついていけないから、ということでClearCaseといわれる

今ではほぼ誰も使ってないであろうバージョン管理ツールが使われ続けることになった。使いにくい社内ミドルウェア

研究所がその道のプロと聞いたので一緒に改善を図った。そしたらRubyしかいたことがない文系新卒の子が出てきた。

一応研究所の人だし…と思って新バージョンプロトの開発を依頼したら、1分以上稼働できない状態になって出てきた。

研究開発は準委任相当なのでそれ以上修正を依頼できずに期間が終わった。

また前の会社独特の文化として、大きなバグを出した開発者反省会(社内ではとある固有名詞で呼ばれている)があった。

この反省会のターゲットになった開発チームはその資料準備で開発が1〜3ヶ月ほど止まるほど大掛かりなイベントだ。

このとき担当品質保証部は「連帯責任から」という理由資料レビューに大変な精を出す。余計なお世話だ。

このため1020ページほどの資料を毎週レビューにかけて最高のものにしていく。でも結局本番では幹部からの怒号が飛んで終わりである

連帯責任かいっていた品質保証部は幹部と一緒になって詰めてくる。連帯責任ではなかったのか。

幹部によると、この反省会があるから今の会社があるんだそう。これを経験して一人前らしい。

こんな感じで開発の体制はひどかったが、世間一般ではホワイト企業と見られている通り有休は取りやすかった。

そのため、転職活動を始めた。そしたらなんと「メモリ32GBのマシン」「mavenが気兼ねなく使える回線」「自動テスト

GitHub」「CI/CD」 という発言ポンポン出てくる。メルカリだのGoogleだのといったイケイWeb系ではなく、

いわゆるSIerでもだ。最初は何だこの格差はと思ったが、まぁ営業トークなんだろうな、と思い直した。というわけで

ケイWeb系も内定は出たものの、つい安定をとってしまい某大企業のDX系の部署転職した。

そしたら何だこれは。最高スペックMacBook ProからGitHubpushするだけで自動デプロイで即サービスイン、

問題が発生したら社用携帯に通知が飛んできて、クラウド監視サービスログをチェック、即修正デプロイ

社内の連絡はSlackで、スタンプを押せばIssueがたち即関連部署対応に走る。OfficeツールGoogle Docsで、

計算表はちゃんと表として使っている。開発者ちゃんと開発をしており、反省会の準備や品質保証部の接待なんて業務はなく

純粋エンドユーザーだけを見ている。ここはなんて最高の環境なんだと歓喜した。また個人的にはおまけ程度であるが、

年収は30万ほど増えて大台に乗った。

さて、それから3年がたった。人間というのはい環境になれると対して喜びを感じなくなる、というのはそうだと思う。

今では別にdeployブランチマージされたらCIが走って自動テストが走りデプロイされるのも、だから何?

って感じだしま普通仕事として淡々とやっている感じはする。待遇面で悪化した点もちらほらあるし

(例えば年間休日が5日ぐらい減った、残業が月5時間ぐらい増えたなど)などもある。

ただ一つ言えることは前の会社には戻れないな…ということである人間一度生活レベルを上げてしまうと下げるのは

とても苦痛に感じてしまものである

ただ、一つだけ今の会社転職してよかったと感じ続けられることが一つある。それは人だ。

前の会社では家でプログラムを書いているなんていった日にはおちょくられたり、人生楽しいの的な目で見られたりした。

芸能人ゴルフの話ができないとコミュ障扱いされた。そのため仕事の話はしても、飲み会にはできるだけ行きたくなかった。

でも今の会社では雑談としてFastlyが落ちても大丈夫CDN構想とか、AtCoderの話をして盛り上がることができる。

ダイバーシティなんていうが、人間所詮同質な人間同士で集まったほうが快適なんだな・・・という複雑な思いを抱いている。

追記

皆さん読んでくれてありがとうございます。いくつか質問が出ているので答えられる範囲で答えます

真面目な疑問なんだけど、Java5のコード書いてる人を1000万で雇う会社があるの?どういうモチベーション??

製品自体90年代から脈々とバージョンアップしている企業向けのソフトウェアなので、コードベースが古いというのがあります

またユーザーからすると中身がJava17だろうがJava5だろうが関係ないわけで、要は業務が滞りなく進めばよいわけです。

そのため昔から受け継がれたスパゲッティコードを地道に解き明かし、新しく出てきた要件を今までのコードベースを壊さずにバグなしで追加していく、

もとからあったバグについては、その他の数百万行のユニットテストもないコードに影響なしで修正を施す、といった技能必要になります

こう考えると意外と希少なスキルなんだな・・・と思えるかもしれません。

clearcaseよりもsubversionの方が100億倍導入も運用簡単だと思うんだけど品管どうなってんの?

ClearCaseご存知な方がいるんですね!一から作る製品だとSubversionのほうが簡単かもしれません。ただ、ClearCase専用の

社内ツールがいくつかあり、そのツールで出力した情報を社内資産として持っているという理由があったりします。

例えばお客さんから「この機能バグってるっぽい」というクレームを受けた際、その機能周辺の情報をそのツールから検索し、

コードレベルで再発防止策を関係部署総出で練った上でお客さんに回答する、という運用フローになっています

そのため、Subversionに変えるためには開発陣の一存では無理で、品質保証部やマネージャー層など全ての知識アップデート

必要になり、そこまでコストをかけて説得して回る必要はあるのか・・・という話になってしまうわけです。

ただ、社内の生産性を向上させるのが目的部署としてはSubversionGitを社内に浸透させたがっているのも事実で、

新規プロダクトなんかはGitを使っていました。ただしGitHubプロキシでアク禁されているだけでなく、サービス名名指しで使用禁止

になっているので、相当の理由がない限り使えないかと思います

主任クラスでも1000万円近くもらえるのか。すごい。

1000万という数字に興味のある方が多かったので参考までに書いておくと、等級ランクというもの存在して管理職を除く最上位のランク

なると2人の子持ち、賃貸住まい、標準評価で大体900万になるという感じです。年功序列だが部署ごとに違うというイメージで、

研究所だと20代で到達する一方、利益を上げていない事業部や間接部署だと定年間際まで到達しない人も多い、ぐらいの感じです。

平均では30代中盤ぐらいでしょうか。

ちなみに私の場合は基本給は33万程度ですが、そこに裁量労働手当と住宅手当、家族手当がついて月給で50万を超えるぐらいでした。

ボーナス個人評価よりも部門業績に大きく左右されるのですが、部署が最高評価場合は夏冬とも150万以上でした。

最後最後ダイバーシティについては、ダイバーシティ勘違いしているように思う

なるほど、たしかに。ちょっと言葉の選びが悪かったかもしれないですね。

2021-04-12

会社自閉症エンジニアがいて辛い

辛い。

本当辛い。

マネージャーらしき人間がいないカオス職場から、この自閉症だかアスペだかわからん同僚は完全に放置状態で本当困っている。

そこそこのプログラムは書けるんだけど、もうトレードオフの考え方がゼロ。やることが何もかも極端すぎ。

なんでユニットテスト書くのに条件判別のための複雑なコードを書くんだよ、これが間違ってないって保証どこにあるわけ?

コードの可読性をまったく気にしない。統一感のあるコードが、このアスペだけは気にせず好きなように書く。

何か気に入らなければ狂犬のように噛み付いてくる。

人の話はまるで聞かない。エゴイストの塊。自分の言うことはどれだけアホなことを言っていても常に正しいと思っている。

アスペ、チームワーク、無理すぎ。

自分はこいつとはこれ以上働けないか職場を去ることが決定しているんだけど、どういう会社なら、こういう人間面接で落としてチームに健全性や秩序を担保しているんだろう?

これは割とまじめに考えているので、知恵のあるはてなー、是非教えてほしい。


アスペとは金輪際一緒に働きたくない!!!!!

2021-04-01

作業実態がほぼない先輩エンジニア

自分とある地方IT企業に勤めている。

最近自社で利用してる社内サービスの大型改修があるということで別案件に配属されたのだが、

そこに元から配属されてた先輩エンジニアコミットログがどうにもおかしい。

先輩は数ヶ月くらい前から俺が担当するのとは別の新機能を3つほど任されてたのだが、

この新機能というのは実態としては別で運用されてる類似サービスとほぼ同機能で、使ってるフレームワークとかも同じ。

相違点はあれどほとんどは項目が減る、とか不要機能がなくなる、みたいなところが中心で、大体はコピペで終わるはずだ。

複雑にデータ依存しあってるとか項目数が膨大とかそういうこともなく割と単純なCRUDだけのよくある管理機能

正直自分ならユニットテストとかリファクタリングとか含めても3つ合わせて1日もあれば終わると思う。

その単純な新機能の開発に何故か先輩は数ヶ月かけていた。

毎日投稿される作業報告書を見るに、それ以外の作業実態ほとんどないみたいだった。

コミットログには、自分が出社して朝礼が始まるまでの5分くらいの間に終わる程度の修正を超細切れに2~3日に数回くらいコミットしてそれっぽく見せていた。

これは完全に社内の体制問題なのだが、今たまたまその部署にいる上長あんまり実態工数感とかわかってない人で、

んでその上社運用サービスってことで納期とか突っつかれることも少ないか適当に口でごまかして今の状況を作り上げたようだった。

ちなみにやってることは「保守要因だから待機が仕事なんだよ」っていうわけでもなく、ガチ業務時間の99%くらいYoutubeやらまとめサイトやら見てんじゃねえのって感じ。

うーん。。。。

だって在宅勤務中に一切Youtubeも5chも見なかったって言ったら嘘になるよ、いやぶっちゃけ割と見てる側だよ。

監視がないのを良いことに犬と散歩出たりお昼休み気持ち長めにとってちょっと遠めのレストラン行ったこともあるよ。



いやにしたって1日の作業に数ヶ月とかかけるのはいくらなんでも攻めすぎだって。。

俺は一応突っ込まれて困らない程度には成果物出してると思うよ。

ここまで極端だと「あの人数ヶ月ほぼ作業実態ないですよ、証拠はこれで~」とか誰かが上にチクリ入れたらどうするつもりなんだよ。

別に俺に実害はあるようなもんじゃないんだがどうすっかなぁ

2021-01-16

実装の一部を変更したときに大量に落ちるテストコード脆弱テストコードと呼ぶらしい

今までの振る舞いと変わるのであればテストは落ちるべきでは?

使っているフレームワークにも依存するけど、controllerのユニットテストDBジョブキューまで確認できたほうが安心じゃないの?

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)

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

2020-12-09

anond:20201209142311

入門書ユニットテストとか書こうと思うと厚さが辞書になってしまう…ただでさえ「ほどほどカラーで、ほどほど厚い」以外は売れないってのに

めっちゃ薄いのはそれはそれで売れないらしいっすよ世の中よくできてるね

2020-10-03

anond:20201003082451

コードが書けない奴を使ったテスターなんて

テスト仕様書に従ったあるいはランダム適当な手動テストしかできないだろ

ユニットテストコードやe2eテストコードが書けるとは思えない

手動テストしてエビデンススクショがいいところ

2019-10-05

Jenkinsってぶっちゃけ必要か?

例えばテスト走らせるだけならcron使うかwebhookでユニットテスト走らせるようにして結果をSlackかに吐けばいいだけじゃない?

そのくらいなら1日もあれば構築できるやろ

Jenkinsって色んな意味で重いのに享受できるメリットグラフィカルに結果を確認できるくらいしかないみたいなの多くない?

多分俺が詳しくないせいなんだろうけどイマイチ魅力がわからない

2019-09-08

文系女性エンンジニア」を「技術力がない」という意味で使うな

もし文系卒の女子エンジニアが5年もののiOSアプリにユニットテストを導入しようとしたらというLTを聞いた。


資料ここにあるが、要約すると

1. 私は開発経験が浅く、一年前まで自動テストを書いたことがなかった

2.しかし、自分たちが開発しているアプリ自動テストがないことに問題意識を持った

3.やるべきか迷ったが「まずは始めるのが大事」 というアドバイスを受けて、最初自動テストを書くことができた

という内容になっている。


タイトル文系卒」女子も内容に関係ない。


発表者が「文系エンジニア」や「女子エンジニア」を「技術力が低い・ない」と同じ意味だと考えているようで不快だった。 いくら発表者自信が文系女性エンジニアからといって、同じ属性の人を馬鹿にしていい理由にはならない。


これを

参加者の皆さまは他の参加者の様々な背景に配慮してください。あなたの何気ない発言や行動で悲しむ人がいるかもしれません。 注意深く、優しく振る舞ってください。

という行動規範を掲げるイベントで発表するのは不適切だと思う。

2019-07-11

中堅Web制作会社から自社サービス企業転職した率直な感想

こんな感じ

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