🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
TestNG

TestNGは、Javaのためのテスティングフレームワーク。JUnitとNUnitにインスパイアを受け開発されました。ユニットテストに限らず、機能テストや統合テストも行うことが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

3429閲覧

テスト。ひょっとしてプロパティのテストというのは作れないのでしょうか?

meshkit

総合スコア72

TestNG

TestNGは、Javaのためのテスティングフレームワーク。JUnitとNUnitにインスパイアを受け開発されました。ユニットテストに限らず、機能テストや統合テストも行うことが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/03/07 05:38

前提・実現したいこと

テストの作成に関して質問です。
Visual Studio 2015 Proで内蔵のMSTestを使ってテストを作っています。

発生している問題・エラーメッセージ

プロパティのテストを作ろうとしたところ、

--------------------------- 単体テストの作成 --------------------------- 単体テストの作成は、パブリック クラスかパブリック メソッド内でのみサポートされます。 --------------------------- OK ---------------------------

とメッセージが出ました。
ひょっとしてプロパティのテストというのは作れないのでしょうか?

該当のソースコード

C#

1using System; 2 3namespace WinForm1 4{ 5 public class Form1 : Form 6 { 7 public string FilePath//<-ここでテスト作成 8 { 9 get 10 { 11 return @"C:\Test\Filename.txt"; 12 } 13 }

補足情報(FW/ツールのバージョンなど)

Visual Studio 2015 Pro
Windows10 64bit

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2018/03/07 06:09

テストコードもアップしてもらえますか
meshkit

2018/03/07 06:17

テストコードを作れなかったので、テストコードは存在しません。
guest

回答3

0

ベストアンサー

右クリックしたら出てくる「単体テストの作成」メニューのことでありますでしょうか。
イメージ説明

で、ありましたら、確かにプロパティを右クリックして作成しようとするとエラーが起こりますし、それ以外の場所から作ってもメソッドのテストコードしか作成されませんね。

でも、対応していないのは「プロパティに対してテストコードの雛形を自動生成すること」であって、テストコードがあればテストはできるのであります。
自分で1からテストコードを書いてしまえばよいのです。

一例ですが、プロパティの値が期待値通りかどうかのテストなら、こんな感じになりますね。

C#

1namespace WinForm1.Tests 2{ 3 [TestClass()] 4 public class Form1Tests 5 { 6 [TestMethod()] 7 public void FilePathTest() 8 { 9 var target = new Form1(); 10 11 var expected = @"C:\Test\Filename.txt"; 12 var actual = target.FilePath; 13 14 Assert.AreEqual(expected, actual); 15 } 16 } 17}

なので、結論としては、「自動では」作れない、「手動なら」作れる、ということになります。

ただ、先に言われているように、そもそもプロパティを一つ一つテストする必要はないんじゃないかなと、だから自動生成には対応していないんじゃないかな、と思います。

投稿2018/03/08 00:02

mifumi323

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meshkit

2018/03/09 01:51

コメントありがとうございます。ずばりのご回答ありがとうございます。 おっしゃるとおり右メニューから自動生成しようとしてできず、あり??? と疑問符でぴよぴよしてました。 自動でできなければ手で書けばいいんですよね、すごくごもっともで、とてもすっきりしました。 テスト例もありがとうございます! みなさんのおっしゃるとおりで、わたしも、そもそもプロパティをひとつひとつテストする必要はないんじゃないかなと考えています。 だから自動生成には対応していないんじゃないかなと、わたしも思い、認識が一致してとてもよかったです。 ただ、一部のPropertyにロジックを書いているところがあります。 これまたそもそもですが、Propertyにはロジックを書いてはいけないのでしょうか。
mifumi323

2018/03/09 13:20

プロパティにロジックを入れちゃだめなんてことはないと思います。 それだったらフィールドとほとんど同じになっちゃいますしね。 でも、プロパティの中でやる処理と言えば、「入力値の検証」であったり、「出力値の補正」であったり、「情報の更新」であったりなど、値のget/setそのものとは切り離して考えられるものが多いと思います。 そういうものを、例えば「入力値の検証」なら「入力値を検証するメソッド」としてプロパティの外に出してしまえば、ロジックはプロパティの中からなくなり、本業である「値の設定・取得」が中心のコードになるのであります。 そうすれば、プロパティの中でテストが必要なコードは、メソッドのテストとしてすでに全部終わっていることになるので、わざわざプロパティのテストを個別にやる必要はなくなるのであります。 まあ、私はめんどくさいから、プロパティの中にロジックとか入れたままにして、値を色々入れてテストしてるんですけどね。
meshkit

2018/03/12 02:31

コメントありがとうございます。同じような感じなので、よかったです。
guest

0

こんにちは。
VisualStudioがテストを生成できるかどうかについて知っているわけではないですが、そのメッセージを見る限り作れないのでしょうとしか言えませんね。

そもそもの話ですが。
C#のプロパティは通常「ロジック」に相当する記述を含むものであってはならないため、そもそもテストの対象ではない、という考え方をするとしっくりくるのではないでしょうか。
プロパティをテストするシーンというと、別の何かしらのロジックの単体テスト上で、「ロジックを実行した後で、プロパティが意図した値を示していること」または「プロパティを設定した状態でロジックを実行し、ロジックが意図した変化を起こしたこと」を確認することになると思います。
「プロパティのみに対して何らかの確認を行いたい」という場面を自分は想像できません。

投稿2018/03/07 16:26

tamoto

総合スコア4252

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meshkit

2018/03/09 01:32

ありがとうございます。 そもそもテストの対象でない、というのはおっしゃる通りです。 わたしも見ながら、Propertyって(基本的に値を入れるだけだし)テストするとしたら値が入っているかどうかを見るだけで、そもそも値が入らないとすればテスト以前にシステム全体の挙動が怪しくなるわけで、そんなのテストする必要あるのだろうか、と感じたのです。 ただ、tamotoさんの前提条件とは違って、Propertyにロジックを書いているところがあります。 ロジックを書いているとすれば、なるほどテストをする必要はあるかもと感じてテストしてみようと思ったら自動では書けなかったので、質問するに至りました。 「プロパティのみに対して何らかの確認を行いたい」という場面を自分は想像できません、というのはわたしも同じです。 そもそも、Propertyにロジックを書いてはいけないのでしょうか?
tamoto

2018/03/09 13:50

プロパティに含む計算は「プロパティ」という意味を変えるものであってはならないと考えています。 getの場合は「オブジェクトの状態を見る/オブジェクトからデータを取り出すもの」という前提を崩さないように、setなら「値をオブジェクトに入力する/オブジェクトの状態を設定するもの」という説明が常に成り立つようにしておく必要があります。 そのため、プロパティ内部での計算は、入力値のフィルタや、状態公開時の小加工程度の計算のみを含むことになります。 その場合、プロパティそのものを単体でテストしなければならないほどのロジックが含まれることはないはずです。プロパティが含むロジックは必ず「他の単体ロジックに付随するもの」となっているはずなのです。 その前提を大幅に超える規模のロジックを含む場合は、それはプロパティではなくメソッドにするべきということなのかもしれません。 VisualStudioのデバッガが、プロパティの内部処理をデフォルトでは自動ステップオーバーする、ということが何を意味するのかを考えてみてもらえると、自分の意図が伝わるかなと期待します。
meshkit

2018/03/12 02:33

コメントありがとうございます。propertyで、そんなに面倒な処理はしていないです。 解説ありがとうございます。わかりやすいです。
guest

0

どうやって作ったんでしょう?

単体テストの基本 ではプライベートフィールドである m_balance を右クリックしてテストを作っているようですが、

新しい単体テスト プロジェクトでは、クラス内のすべてのメソッドに単体テスト スタブが作成されます。

とあります。
これは 2015 ですが、2017 でもそうなります。

投稿2018/03/07 22:24

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meshkit

2018/03/09 01:43 編集

コメントありがとうございます。いえ、まだPropertyのテストは作っていなくて、自動ではできないので、ひょっとして作れないのか? と疑問になり質問しました。 追加情報ありがとうございます。いまはメソッドごとに手作業でテストを作ってますが、一括して作れるのでしょうか。試してみます。
meshkit

2018/03/09 02:02

やってみました! 新しい単体テストを作ると、クラス内のすべてのmethodのテストを一括生成できました。 これまで、できていなかった理由は不明ですが、これでひとつずつ作る手間がなくなりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問