Kumassy / pro1-tester

BDD for Pro1

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

pro1-tester

BDD for Pro1

Overview

プロ1のテストを自動化するためのスクリプトです。 テストを実行するにはtestcase.ymlを書く必要がありますが、 https://github.com/Kumassy/pro1-tester-testcases で共有しています。

Usage

testcase.default.yml または testcase.yml をソースコード *.c と同じディレクトリに置いてください:

.
├── assignment_09-a-01.c
├── assignment_09-a-02.c
├── assignment_09-a-03.c
├── assignment_09-a-04.c
├── assignment_09-a-05.c
├── assignment_09-b-01.c
├── assignment_09-b-02.c
├── assignment_09-b-03.c
├── assignment_09-b-04.c
├── assignment_09-c-01.c
├── assignment_09-c-02.c
├── assignment_09-d-01.c
├── testcase.yml
└── testcase.default.yml

そして

pro1-tester

を実行するとテスト結果がでます。

オプション 説明
-d デフォルトではtestcase.ymlがある場合はそちらを実行しますが、このオプションをつけるとtestcase.default.ymlを使うようになります
-s ストリクトモード で実行します。デフォルトでは標準出力とexpectはスペースと改行を無視して比較されますが、ストリクトモードでは厳密に比較します

Setup (KO Unix)

KO の Unix で使う場合、Rubyはインストールされているので gem のインストールだけすれば OK です。
--user-installオプションをつけてユーザー領域に gem をインストールするようにします:

gem install pro1-tester --user-install

pro1-testerコマンドを使えるようにパスを通します。

vim ~/.bash_profile

PATH=$PATH:$HOME/binという行があると思うので、次のように$HOME/.gem/ruby/2.3.0/binを追記します:

# 追記
PATH=$PATH:$HOME/.gem/ruby/2.3.0/bin

.bash_profileを再読み込みします

source ~/.bash_profile

これでパスが通りました

which pro1-tester
~/.gem/ruby/2.3.0/bin/pro1-tester

Setup (Basic)

Vagrant でも使って CentOS 環境で動かしましょう。 Ruby のインストールをしましょう。

そして、次のコマンドで gem をインストールしてください:

gem install pro1-tester

Setup (docker)

Docker イメージのビルド

git clone https://github.com/Kumassy/pro1-tester
cd pro1-tester
docker build -t my-ruby-image .

Docker コンテナの実行

cd /path/to/source/and/testcase.yml/
docker run -it --rm -v "$PWD":/app/ -w /app/ my-ruby-image pro1-tester

Writing testcase.yml

YAML の記法で書いていきます。 基本的に雰囲気で書けばOKです。

- target: a-01
  testcase:
    - input: |
        stdin
      args: |
        command line args
      expect: |
        expectation of stdout
      label: |
        printed when this testcase raises error

  • 出力だけ見るプログラムの場合、inputは省略可能です。
  • labelitに渡すアレです。省略した場合はデフォルトのラベルが使われます。
  • inputに特定の文字("とか\とか)が含まれるときはエスケープが必要です。
  • inputの最後に改行が必要でinputを1行で書くときは、input""で囲って最後に\nをつけてください。
  • 複数行の文字列を書くときには注意しましょう。
- expect: |
    A(65)  # ここでインデントつける
    B(66)
    C(67)
    D(68)
    E(69)

- expect: |
  A(65)  # これはシンタックスエラー
  B(66)
  C(67)
  D(68)
  E(69)

注意

  • 無限ループ内で標準入力を読んでいて、C-dをスルーするプログラムの場合はこのスクリプトも無限ループに陥ります(OS がプロセスを強制終了する場合もあります)。
  • 仕様上、標準入力に書き込んでその標準出力を見て、その結果に応じてさらに標準入力にデータを流すことはできません。標準入力にガーッと書き込んでダーッと結果を検証する感じでお願いします。
  • 標準エラー出力は無視されます。
  • このテストケースをパスすればあなたのプログラムが確実に正しい動作をする、ということは完全には保証できません。提出前には手動で最終確認をすることを推奨します。

仕様

  • 標準入力にはinputのパース結果がそのまま渡されます
    • input を1行で書いたときは明示的に\nを指定しない限り改行コードは渡されません(Enter キー押さないのと同じ)。
    • input|を使って複数行で書いたときは、最終行も含めそれぞれの行末に\nがつきます。

My Environment (on Vagrant)

cat /etc/redhat-release
CentOS release 6.7 (Final)
ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
rspec -v
3.4.4
gcc -v
Using built-in specs.
Target: x86_64-redhat-linux
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
スレッドモデル: posix
gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
docker -v
Docker version 1.7.1, build 786b29d

TODO

  • 無限ループするプログラムに対してのタイムアウト処理

About

BDD for Pro1

License:MIT License


Languages

Language:Ruby 98.1%Language:Shell 1.9%