Robot Framework + SSHLibraryで、SSHのテストをする

この記事は 「Robot Framework Advent Calendar 2017 - Qiita」 の21日目の記事です。

Robot Frameworkでは、 SSHLibrary を使ってSSHのテストができます。

そこで今回、SSHLibraryを試してみました。

 
目次

 

環境

  • Python 2.7.14
    • SSHLibraryがPython3系に対応していないため
  • Robot Framework 3.0.2
  • SSHLibrary 2.1.3

 

SSHサーバの用意

SSHLibraryはSSHクライアントなので、SSHサーバを別途用意する必要があります。

今回はSSHサーバをDocker (Ubunt 16.04ベース) で作成します。

なお、Dockerfileの内容は、Dockerのドキュメントにあったものをそのまま使います。
Dockerize an SSH service | Docker Documentation

また、公開鍵認証も試すため、以下を参考にDockerfileや公開鍵を準備します。
Docker | 公開鍵を使ってサーバーにssh接続する ( コンテナに公開鍵をコピーする場合 ) - Qiita

 
まずは公開鍵を準備します。

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_sshlibrary_sample

Dockerコンテナに公開鍵を転送するため、作成した公開鍵( id_rsa_sshlibrary_sample.pub ) を、Dockerfileと同じディレクトリに入れておきます。

 
Dockerfileは以下の通りです。

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

# ローカルで生成した公開鍵をコンテナへ転送
COPY id_rsa_sshlibrary_sample.pub /root/authorized_keys

# ディレクトリ作成、キーの移動、パーミッションの変更
CMD mkdir ~/.ssh && \
    mv ~/authorized_keys ~/.ssh/authorized_keys && \
    chmod 0600 ~/.ssh/authorized_keys

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

 
ビルド後、起動しておきます。

# ビルド
$ docker build -t eg_sshd .

# 起動:Dockerのポート22はMacの12345ポートへと転送
$ docker run -d -p 12345:22 --name test_sshd eg_sshd

 
なお、このテスト終了後は削除を忘れずに行います。

$ docker stop test_sshd
$ docker rm test_sshd
$ docker rmi eg_sshd

 

SSHLibraryの実行

インストール

pipでインストールします。

なお、以下のissueにある通り、まだPython3系では動かないことに注意します。

# バージョン確認
$ python --version
Python 2.7.14

# pipでインストール
pip install robotframework-sshlibrary

 

テストケースの作成

今回はパスワード認証と公開鍵認証の2つでSSH接続してみます。

*** Settings ***
Library  SSHLibrary

*** Variables ***
${user}  root
${password}  screencast

*** Test Cases ***
パスワードでログインしてhelloする
    Open Connection  localhost  port=12345
    Login  root  screencast
    ${output} =  Execute Command  echo Hello SSHLibrary with password!
    Log To Console  ${\n}${output}
    Should Be Equal  ${output}  Hello SSHLibrary with password!
    Close All Connections

公開鍵でログインしてhelloする
    Open Connection  localhost  port=12345
    # 鍵は秘密鍵を指定する
    Login With Public Key  root  id_rsa_sshlibrary_sample  screencast
    ${output} =  Execute Command  echo Hello SSHLibrary with public key!
    Log To Console  ${\n}${output}
    Should Be Equal  ${output}  Hello SSHLibrary with public key!
    Close All Connections

 

テストの実行

両方のテストがパスしました。

$ robot test_ssh.robot 
===========================
Test Ssh
===========================
パスワードでログインしてhelloする    ...
Hello SSHLibrary with password!
パスワードでログインしてhelloする    | PASS |
-------------------------------------
公開鍵でログインしてhelloする    ...
Hello SSHLibrary with public key!
公開鍵でログインしてhelloする    | PASS |
-------------------------------------
Test Ssh    | PASS |
2 critical tests, 2 passed, 0 failed
2 tests total, 2 passed, 0 failed

 

ソースコード

GitHubに上げました。ssh_library_sample ディレクリの中が今回のものです。
thinkAmi-sandbox/RobotFramework-sample: Robot Framewrok samples