1.Nunitを入手する
https://launchpad.net/nunitv2
現在は、2.6.3
Nunit-2.6.3.msi をダウンロード。
インストール実行
2.Nunitの設定を変更
Nunitを起動する。
メニューバー⇒Tools⇒Settings...
IDE SupportのVisual Studioをクリック
Enable Visual Studio Supportにチェックをつける(Expressでも)
3.クラスとテストを結びつける
テスト対象のクラスを作成
テストクラスを作成
[テストクラス側]
nunitを認知させる
⇒参照設定の .NET タブを選択 nunit.framework を追加
テスト対象を認知させる
⇒参照設定のプロジェクトからテスト対象のクラスを選択
[テスト対象クラス側]
テストクラスを認知させる
Properties⇒AssemblyInfo.cs
[assembly: InternalsVisibleTo("テストクラス名")]
4.テストを書く
テストクラスの前に[TestFixture]を書く。
using NUnit.Framework;
していないと破線でそんなの知らんとおこるので、[TestFixture]上でCtrl+. でuse NUnit.Frameworkを表示
[Test]
テストメソッドの前につける
[TestCase]
テストメソッドの前に引数の値をリスト化して並べる
メソッド
Assert.True(期待値 == 実際の値, [メッセージ]);
Assert.AreEqual(期待値, 実際の値);
Assert.IsNull(実際の値);
Assert.IsEmpty(実際の値)
Assert.IsInstanceOfType(期待値, 実際の値);
Assert.IsAssignableFrom(期待値, 実際の値);
http://www.nunit.org/index.php?p=classicModel&r=2.6.3
5.テストしてみる
・ソースをビルドする
・Nunitを立ち上げ、dllを読み込む
・Unitで保存をしておく(設定の保存)
・Runで実行
サイクルを回す
以上、度忘れした時ようのためのエッセンシャル版まとめ。
参考
http://qiita.com/rohinomiya/items/47f09523f1b9dfa015b1
http://codezine.jp/article/detail/6518
Translate
2013年11月30日土曜日
2013年10月13日日曜日
ruby学習めも
■出力
print, puts の違い putsは最後に¥nを書かなくても改行してくれる。
ただ、putsはコンマ区切りで書くとその都度改行する。
■変数の展開
ダブるクォート内で #{変数名} と書くと展開してくれる
■コメント
# 一行コメント
=begin
複数行にわたる
コメントアウト
=end
■if文
if 条件
式
elsif 条件
式
else
式
end
一行でもかける。
式 if 条件
if の反対としてunlessもある。
文字列.empty? 長さ0ならtrue じゃないければ false
(真偽値を返すメソッドは?を末尾につけるルールあり)
■真偽判定は、
偽:nil, false
真:上記以外
■CASE
case 変数
when 値[, 値]
when 値[, 値]
else
end
■for
for 変数 in 開始の値..終了の値
end
for 変数 in オブジェクト
end
■while(条件が真の間ループ)
while 条件
式
end
一行でも書ける。
式 while 条件
whileの反対としてuntilもある
■配列、ハッシュのイテレータ
配列.each do |変数|
end
ハッシュ.eadh do |変数(キー), 変数(値)|
end
■break, next, redo
break…ループを抜ける
next…次のループへ
redo…同じ条件でもう一度
■コマンドラインからの引数
ARGV配列にあるよ。
puts "第一引数:#{ARGV[0]}"
puts "第二引数:#{ARGV[1]}"
puts "第三引数:#{ARGV[2]}"
■変換
文字列→数字
変数.to_i
数字→文字列
変数.to_s
■メソッド
def メソッド名(引数)
end
・引数のデフォルト値は 引数 = 値とする
戻り値はreturn 値
省略可。省略時は、最後に得られた値が戻る
・キーワードによる引数の受け渡し(key, value)
defメソッド名(引数1:値, 引数2:値,…)
end
def area(x:0, y:0, z:0)
return (x*y + y*z + z*x) * 2
end
p area(x:2, y:3, z:4) #=> 52
p area(x:2, z:3) #=>12
・引数の数が不定の時 その1
def メソッド名(*変数名) #配列として受け取る
end
例)
def a(a, *b, c)
return [a, b, c]
end
p a(1, 2, 3, 4, 5) #=> [1, [2, 3, 4], 5]
p a(1, 2) #=> [1, [], 2]
・引数の数が不定の時 その2 キーワード引数(ruby 2.0以降)
def メソッド名(**変数名) #ハッシュとして受け取る
end
例)
def meth(x:0, y:0, z:0, **args)
return [x, y, z, args]
end
p meth(z:4, y:3, x:2) #=> [2, 3, 4, {}]
p meth(x:2, z:3, v:4, w:5) #=> [2, 0, 4, {:v=>4, :w=>5}]
・引数に渡した際配列を展開する
例)
def foo(a, b, c)
return a + b + c
end
args1 = [2, 3]
p foo(1, *args1) #=> 6 展開される!
■ライブラリを読み込む
require (相対パス)ファイル名(.rbは省略可)
■定数
変数名の先頭が大文字だと定数扱い
■変数の入れ替え
変数をまとめて入れる機能を利用すると
a, b = b, a と書くことで入れ替えができる
全般的にまとめて入れる機能は、なじみにくいから様子見としておこう。
■どのクラスのインスタンスか調べる
変数.instance_of?(クラス名)
■クラスの親子関係を調べる
変数.is_a?(クラス名)
str = "hogehoge"
p str.is_a?(String) #=> true
p str.is_a?(Object) #=> true
■変数
ローカル変数
→小文字or_で始まる
グローバル変数
→$で始まる
インスタンス変数
→@で始まる
クラス変数
→@@で始まる
■クラスの作り方
class クラス名 #大文字で始める
end
■コンストラクタ
initializeメソッド
■インスタンス変数
@で始まる名前をつけるとインスタンスごとの変数となる
■setter/getter
class クラス名
def インスタンス変数名
return @name
end
def インスタンス変数=(変数)
@name = 変数
end
■一番簡単なsetter/getterの場合
attr_reader :変数名 #読み取りのみ
attr_writer :変数名 #書き取りのみ
attr_accessor :変数名 #読み書きOK
ここでは、@はつけない
この場合は、self.変数名 (@はつけない)でアクセスする
■クラスメソッド
class << クラス名
def メソッド名
end
end
or
class クラス名
class << self
def メソッド名
end
end
end
or
def クラス名.メソッド名
end
or
class クラス名
def self.メソッド名
end
end
■クラス内定数
クラス名::定数名 でアクセス可能
■クラス変数
@@変数名 で定義すると全てのインスタンスからアクセス可能となる
■アクセス制限
指定方法 その1:一つずつ直接指定
public :メソッド名 #デフォルトなので設定する必要はない
private: メソッド名 #インスタンス経由でのアクセスを禁じる時
protected: メソッド名 #同一クラスとそのサブクラスから呼び出し可能
public
def メソッド1
end
def メソッド2
end
private
def メソッド3
end
def メソッド4
end
■クラスまとめ
class クラス名(大文字で始める)
#クラス変数
@@変数名
#クラスメソッド
def クラス名.メソッド名
end
attr_reader :変数名 #読み取りのみ
attr_writer :変数名 #書き取りのみ
attr_accessor :変数名 #読み書きOK
#インスタンスメソッド
def メソッド名
end
#コンストラクタ
def initialize(引数)
@変数 = 引数 #インスタンス変数
end
end
■クラスの拡張
class String
def メソッド名
end
end
で拡張できる
■クラスのツリー図
■継承
class クラス名 < スーパークラス名
def メソッド
super(引数) #スーパークラスの同名メソッドを呼ぶ
end
end
■モジュール
module モジュール名
def メソッド名
end
module_function :メソッド名 #公開する モジュール名.メソッド名で呼べる?
end
include モジュール名で利用できるようになる
print, puts の違い putsは最後に¥nを書かなくても改行してくれる。
ただ、putsはコンマ区切りで書くとその都度改行する。
■変数の展開
ダブるクォート内で #{変数名} と書くと展開してくれる
■コメント
# 一行コメント
=begin
複数行にわたる
コメントアウト
=end
■if文
if 条件
式
elsif 条件
式
else
式
end
一行でもかける。
式 if 条件
if の反対としてunlessもある。
文字列.empty? 長さ0ならtrue じゃないければ false
(真偽値を返すメソッドは?を末尾につけるルールあり)
■真偽判定は、
偽:nil, false
真:上記以外
■CASE
case 変数
when 値[, 値]
when 値[, 値]
else
end
■for
for 変数 in 開始の値..終了の値
end
for 変数 in オブジェクト
end
■while(条件が真の間ループ)
while 条件
式
end
一行でも書ける。
式 while 条件
whileの反対としてuntilもある
■配列、ハッシュのイテレータ
配列.each do |変数|
end
ハッシュ.eadh do |変数(キー), 変数(値)|
end
■break, next, redo
break…ループを抜ける
next…次のループへ
redo…同じ条件でもう一度
■コマンドラインからの引数
ARGV配列にあるよ。
puts "第一引数:#{ARGV[0]}"
puts "第二引数:#{ARGV[1]}"
puts "第三引数:#{ARGV[2]}"
■変換
文字列→数字
変数.to_i
数字→文字列
変数.to_s
■メソッド
def メソッド名(引数)
end
・引数のデフォルト値は 引数 = 値とする
戻り値はreturn 値
省略可。省略時は、最後に得られた値が戻る
・キーワードによる引数の受け渡し(key, value)
defメソッド名(引数1:値, 引数2:値,…)
end
def area(x:0, y:0, z:0)
return (x*y + y*z + z*x) * 2
end
p area(x:2, y:3, z:4) #=> 52
p area(x:2, z:3) #=>12
・引数の数が不定の時 その1
def メソッド名(*変数名) #配列として受け取る
end
例)
def a(a, *b, c)
return [a, b, c]
end
p a(1, 2, 3, 4, 5) #=> [1, [2, 3, 4], 5]
p a(1, 2) #=> [1, [], 2]
・引数の数が不定の時 その2 キーワード引数(ruby 2.0以降)
def メソッド名(**変数名) #ハッシュとして受け取る
end
例)
def meth(x:0, y:0, z:0, **args)
return [x, y, z, args]
end
p meth(z:4, y:3, x:2) #=> [2, 3, 4, {}]
p meth(x:2, z:3, v:4, w:5) #=> [2, 0, 4, {:v=>4, :w=>5}]
・引数に渡した際配列を展開する
例)
def foo(a, b, c)
return a + b + c
end
args1 = [2, 3]
p foo(1, *args1) #=> 6 展開される!
■ライブラリを読み込む
require (相対パス)ファイル名(.rbは省略可)
■定数
変数名の先頭が大文字だと定数扱い
■変数の入れ替え
変数をまとめて入れる機能を利用すると
a, b = b, a と書くことで入れ替えができる
全般的にまとめて入れる機能は、なじみにくいから様子見としておこう。
■どのクラスのインスタンスか調べる
変数.instance_of?(クラス名)
■クラスの親子関係を調べる
変数.is_a?(クラス名)
str = "hogehoge"
p str.is_a?(String) #=> true
p str.is_a?(Object) #=> true
■変数
ローカル変数
→小文字or_で始まる
グローバル変数
→$で始まる
インスタンス変数
→@で始まる
クラス変数
→@@で始まる
■クラスの作り方
class クラス名 #大文字で始める
end
■コンストラクタ
initializeメソッド
■インスタンス変数
@で始まる名前をつけるとインスタンスごとの変数となる
■setter/getter
class クラス名
def インスタンス変数名
return @name
end
def インスタンス変数=(変数)
@name = 変数
end
■一番簡単なsetter/getterの場合
attr_reader :変数名 #読み取りのみ
attr_writer :変数名 #書き取りのみ
attr_accessor :変数名 #読み書きOK
ここでは、@はつけない
この場合は、self.変数名 (@はつけない)でアクセスする
■クラスメソッド
class << クラス名
def メソッド名
end
end
or
class クラス名
class << self
def メソッド名
end
end
end
or
def クラス名.メソッド名
end
or
class クラス名
def self.メソッド名
end
end
■クラス内定数
クラス名::定数名 でアクセス可能
■クラス変数
@@変数名 で定義すると全てのインスタンスからアクセス可能となる
■アクセス制限
指定方法 その1:一つずつ直接指定
public :メソッド名 #デフォルトなので設定する必要はない
private: メソッド名 #インスタンス経由でのアクセスを禁じる時
protected: メソッド名 #同一クラスとそのサブクラスから呼び出し可能
public
def メソッド1
end
def メソッド2
end
private
def メソッド3
end
def メソッド4
end
■クラスまとめ
class クラス名(大文字で始める)
#クラス変数
@@変数名
#クラスメソッド
def クラス名.メソッド名
end
attr_reader :変数名 #読み取りのみ
attr_writer :変数名 #書き取りのみ
attr_accessor :変数名 #読み書きOK
#インスタンスメソッド
def メソッド名
end
#コンストラクタ
def initialize(引数)
@変数 = 引数 #インスタンス変数
end
end
■クラスの拡張
class String
def メソッド名
end
end
で拡張できる
■クラスのツリー図
| BasicObject | ||||
| ⇒ | Object | |||
| ⇒ | Array | |||
| ⇒ | String | |||
| ⇒ | Hash | |||
| ⇒ | Regexp | |||
| ⇒ | IO | |||
| ⇒ | File | |||
| ⇒ | Dir | |||
| ⇒ | Numeric | |||
| ⇒ | Integer | |||
| ⇒ | Fixnum | |||
| ⇒ | Bignum | |||
| ⇒ | Float | |||
| ⇒ | Complex | |||
| ⇒ | Rational | |||
| ⇒ | Exception | |||
| ⇒ | Time |
■継承
class クラス名 < スーパークラス名
def メソッド
super(引数) #スーパークラスの同名メソッドを呼ぶ
end
end
■モジュール
module モジュール名
def メソッド名
end
module_function :メソッド名 #公開する モジュール名.メソッド名で呼べる?
end
include モジュール名で利用できるようになる
2013年8月17日土曜日
[perl]クラスメソッド
学習のため、某JavaのソースコードをPerlで表現してみる。
実行してみる
実行結果:
perlで表現してみます。
実行結果:
たいした違いはないですね。
クラス内の変数にアクセスするためにourで宣言しています。
public class Counter {
static int num = 0;
static int getCounter(){
return ++num;
}
}実行してみる
public class SandBox extends Counter {
public static void main(String[] args){
System.out.println(Counter.getCounter());
System.out.println(Counter.getCounter());
System.out.println(Counter.getCounter());
System.out.println("クラスフィールド:" + Counter.num);
}
}実行結果:
1 2 3 クラスフィールド:3
perlで表現してみます。
package Counter;
use strict;
use warnings;
our $num = 0;
sub getCounter{
return ++$num;
}
1;use strict; use warnings; use utf8; use feature 'say'; binmode STDOUT, ":utf8"; use lib qw(lib); use Rectangle; use Counter; say Counter::getCounter(); say Counter::getCounter(); say Counter::getCounter(); say "クラス内変数:". $Counter::num;
実行結果:
1 2 3 クラス内変数:3
たいした違いはないですね。
クラス内の変数にアクセスするためにourで宣言しています。
[perl]複数のコンストラクタに対応するには?
学習のため、某JavaのソースコードをPerlで表現してみる。
Javaでは引数違い同名のメソッドを持つことができます。
便利ですね。
引数無しのnewならデフォルト10, 20をセット
値があればそちらをセット同じことをPerlでやってみます。
処理をまねするならこうなるでしょうかねぇ?
引数の数で振り分けるしかないと思います。
実行してみます。
実行結果:
Javaでは引数違い同名のメソッドを持つことができます。
便利ですね。
class Rectangle {
int width;
int height;
Rectangle(){
setSize(10, 20);
}
Rectangle(int w, int h){
setSize(w, h);
}
void setSize(int w, int h){
width = w;
height = h;
}
int getArea(){
return width * height;
}
}引数無しのnewならデフォルト10, 20をセット
値があればそちらをセット同じことをPerlでやってみます。
処理をまねするならこうなるでしょうかねぇ?
package Rectangle;
use strict;
use warnings;
use utf8;
binmode STDERR, ":utf8";
sub new{
my $self = bless{}, shift;
#引数チェック
if(@_==0){
$self->setSize(10, 20);
}elsif(@_==2){
$self->setSize($_[0], $_[1]);
}else{
die("コンストラクタは引数無し または、
2引数を指定してください(width, height)");
}
return $self;
}
sub setSize{
my $self = shift;
if(@_!=2){die("setSizeの引数を2つ指定してください(width, height)")}
$self->{width} = $_[0];
$self->{height} = $_[1];
}
sub getArea{
my $self = shift;
return $self->{width} * $self->{height};
}
1;引数を明示しない言語なので引数違いの同名メソッドは作れないので引数の数で振り分けるしかないと思います。
実行してみます。
use strict;
use warnings;
use utf8;
use feature 'say';
binmode STDOUT, ":utf8";
use lib qw(lib);
use Rectangle;
my $r1 = Rectangle->new();
my $r2 = Rectangle->new(123, 5);
output($r1);
output($r2);
sub output{
my $self = shift;
say "幅 :". $self->{width};
say "高さ:". $self->{height};
say "面積:". $self->getArea();
}
実行結果:
幅 :10 高さ:20 面積:200 幅 :123 高さ:5 面積:615
[perl]コンストラクタで値の初期化
学習のため、某JavaのソースコードをPerlで表現してみる。
引数無しでnewされた場合
setSizeメソッドを使って幅10, 高さ20を指定するわけですね。
では、やってみましょう。
ポイントは第一引数にオブジェクトを渡すためには、blessした
オブジェクト経由でメソッドを呼ばないといけないというあたりですかね・・・
これで最初に書いたメソッドをうまく再利用できてますね。
では使ってみます。
出力結果:
初期化の時は直接記載しようよ。
というのであれば、
では、Perlでは
class Rectangle {
int width;
int height;
Rectangle(){
setSize(10, 20);
}
void setSize(int w, int h){
width = w;
height = h;
}
int getArea(){
return width * height;
}
}引数無しでnewされた場合
setSizeメソッドを使って幅10, 高さ20を指定するわけですね。
では、やってみましょう。
package Rectangle;
use strict;
use warnings;
use utf8;
binmode STDERR, ":utf8";
sub new{
my $class = shift;
my $self = bless {width=>0, height=>0}, $class;
#引数無しでnewされたらデフォルト値を指定
if (@_==0){$self->setSize(10, 20)};
return $self;
}
sub setSize{
my $self = shift;
if(@_!=2){die("setSizeの引数を2つ指定してください(width, height)")}
$self->{width} = $_[0];
$self->{height} = $_[1];
}
sub getArea{
my $self = shift;
return $self->{width} * $self->{height};
}
1;ポイントは第一引数にオブジェクトを渡すためには、blessした
オブジェクト経由でメソッドを呼ばないといけないというあたりですかね・・・
これで最初に書いたメソッドをうまく再利用できてますね。
では使ってみます。
use strict;
use warnings;
use utf8;
use feature 'say';
binmode STDOUT, ":utf8";
use lib qw(lib);
use Rectangle;
my $r = Rectangle->new();
say "幅 :". $r->{width};
say "高さ:". $r->{height};
say "面積:". $r->getArea();
出力結果:
幅 :10 高さ:20 面積:200
初期化の時は直接記載しようよ。
というのであれば、
class Rectangle {
int width = 10;
int height = 20;
void setSize(int w, int h){
width = w;
height = h;
}
int getArea(){
return width * height;
}
}こうなると思います。では、Perlでは
package Rectangle;
use strict;
use warnings;
use utf8;
binmode STDERR, ":utf8";
sub new{
return bless {width=>10, height=>20}, shift;
}
sub setSize{
my $self = shift;
if(@_!=2){die("setSizeの引数を2つ指定してください(width, height)")}
$self->{width} = $_[0];
$self->{height} = $_[1];
}
sub getArea{
my $self = shift;
return $self->{width} * $self->{height};
}
1;
登録:
投稿 (Atom)