今年の言語はRust その２７


# 今年の言語はRust その２７


Rustを学びます


Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/



## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```


## 11. 自動テストを書く


### 11.2 テスを走らせる

さてさて、テストコードの実行方法にての章です

チートとして一覧をまず見せます

```rust
// テスト実行
cargo test
// テストのヘルプ
cargo test --help
// テストのオプションのヘルプ
cargo test -- --help

// スレッド数を設定 (デフォルトは1以上)
cargo test -- --test-threads=1
// 出力を表示
cargo test -- --nocapture

// one_hundred関数だけをテスト
cargo test one_hundred
// addが含まれるをテスト
cargo test add

// テストを無視する
cargo test -- --ignored

```

#### --nocatpture

テストが成功すると、関数内の出力は__キャプチャ__ されて、表示されない。
もし、確認したければ__--nocapture__ オプションを利用する


```rust

fn prints_and_returns_10(a: i32) -> i32 {
    println!("I got the value {}", a);
    10
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn this_test_will_pass() {
        let value = prints_and_returns_10(4);
        assert_eq!(10, value);
    }

    #[test]
    fn this_test_will_fail() {
        let value = prints_and_returns_10(8);
        assert_eq!(5, value);
    }
}
--
$ cargo test -- --nocapture
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running target/debug/deps/adder-eb1f67e545695558

running 2 tests

↓ --nocaptureによりキャプチャされずに表示されている
I got the value 4
test tests::this_test_will_pass ... ok

↓ テストが失敗したので, キャプチャされずに表示されている
I got the value 8
thread 'tests::this_test_will_fail' panicked at 'assertion failed: `(left == right)`
  left: `5`,
 right: `10`', src/lib.rs:19:9
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
test tests::this_test_will_fail ... FAILED

failures:

failures:
    tests::this_test_will_fail

test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out

error: test failed, to rerun pass '--lib'

```

####　名前でテストの一部を実行 

名前を指定することで、名前に文字列が __含まれる__ 関数だけ実行される

```rust
pub fn add_two(a: i32) -> i32 {
    a + 2
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn add_two_and_two() {
        assert_eq!(4, add_two(2));
    }

    #[test]
    fn add_three_and_two() {
        assert_eq!(5, add_two(3));
    }

    #[test]
    fn one_hundred() {
        assert_eq!(102, add_two(100));
    }
}
```

```bash
// add_*だけ実行
$ cargo test add

// one*だけ実行
$ cargo test one
```

#### 特に要望のない限りテストを無視する

```rust
#[test]
fn it_works() {
    assert_eq!(2 + 2, 4);
}

#[test]
#[ignore]
fn expensive_test() {
    // 実行に1時間かかるコード
    // code that takes an hour to run
}
```

```bash
$ cargo test

running 2 tests
test expensive_test ... ignored
test it_works ... ok

test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out

   Doc-tests adder

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

```




次回はラストテスト!


イエス！