Category: 開発

  • Djangoのunit testをGitHubActionsで動かす

    この記事はこの記事は”東京高専プロコンゼミ① Advent Calendar 2019” 24日目の記事です.


    おはようございます, 記事を書いてる現在12/25 0時20分です.もう遅刻が当たり前になってきました. さて今日はようやくクリスマス・イブです,が アドベントカレンダーの枠を取ってしまったので記事を書いて行きます. 別にアドベントカレンダーを書いてるからクリボッチをしてるわけではないんですが


    今回の記事は前回のDjangoでtestsを書くはなしの続きです, まだ読んでないかたは適当に読み流してきてからこの記事を読むとわかりやすいかもしれません.

    GitHub Actions

    https://github.co.jp/features/actions

    GitHub Actionsってなんぞやって人のために一応説明しておくと, GitHub Actionsは設計図共有サイトであるGitHubが2019/11/13にリリースしたワークフロー自動化サービスです, これまではCircle CI などの外部サービスを使わないとできなかった高度なワークフローの自動化がGitHub内でできるようになりました. MSがGitHubを買収してからGitHubの新機能がすごい増えた気がします.

    値段とか

    基本的に無料で使えます. しかもLinuxだけじゃなくWindows, Macとかも動かせます. これまでWindowやmacOSが無料で使えるサービスはなかった気がするので, 結構大盤振る舞いです.

    設定

    設定はymlファイルでおこないます, β版のときはGUIエディターが用意されてたんですが, リリース版では廃止されています. 設定の書き方はCircle CIにすごい似てるらしいです.

    やりたいこと

    各Pushごとに前回の記事で書いたテストコードを自動で実行するようにします. そのためにはPythonの環境を揃えるのと, データベース(Postgresql)を立ち上げる必要があります.

    Python

    公式でtemplateが用意されてたのでそのファイルに書き込む形で作りました.

    Pythonのコンフィグはこんな感じになりました, 上の方で Pythonのパッケージをインストールしていて, 下の方で実際にテストを実行しています.

    DB(PostgreSQL)

    DjangoのtestはDBにアクセスするものもあるためDBを立てる必要があります, Exampleが公開されていたのでそれを流用しました.

    https://github.com/actions/example-services/blob/master/.github/workflows/postgres-service.yml

    最終的なConfig

    結果(?)

    動きました, 各pushごとにちゃんとテストを実行してくれます.

    PRを出すとそのPRでテストが通ってるかわかりやすく表示してくれます. 嬉しい!!

    まとめ

    GitHub Actions, 無料だし簡単に使えるので是非使いましょう. 毎回のPRでコーディング規約を守っているか, ビルドが通るかとかの確認くらいは来年のプロコンの開発で回せると(ある程度)安全な開発ができると思います.

  • Djangoでtestsを書く話

    この記事は東京高専プロコンゼミアドベントカレンダー②16日目の記事です。①の10日目の記事をまだ書いていない気がしますがきっと気の所為です、ええ。

    Djangoでtestsを書いてみたので記事にします。

    モチベーション

    去年のadvent calendarのネタとして作ったto2.pwをまだ動かしているのですがバグを直したり機能を追加するたびに全ての機能が問題なく動くか確認するという作業が発生して実際何度かインシデントを起こしたりしたのと、自分がメインの開発でテストコードを書くという経験をしたことがなかったので書いてみました。決してadvent calendarのための記事を書かないといけないからではない


    記事中で出てくるコードは大体ここにあるので全体が見たかったらどうぞ。

    testsとは?

    ここで言うtestsはソフトウェアテストのことです、ソースコード本体とは別にソースコードを”テスト”するためのコードを書き、自動で実行してバグの発生を防ぎます。最近では(?)ソースコード本体を書く前に仕様として満たすべき内容のテストを書き、その後開発するTDD(Test-Driven Development, テスト駆動開発)なる概念もあったりします。

    日本語でtestsと”s”を付けて書いたら学校の定期テストなどではなくソフトウェアの自動テストを指すことが多い気がします、Googleも”tests”を”ソフトウェアテスト”と認識してるっぽいです。

    Django

    Pythonで書けるweb frameworkです、全てのweb frameworkの中で一番高機能(or 高レイヤー)な気がします。初めから管理画面がユーザー認証が用意されていたりします。去年の課題部門ではDjangoを使った開発をしていたはずです、あと最近は使われてませんが(そもそも物をおいてないですが) 部内のpossysもDjangoを使って書かれてます。

    ちなみにDjangoは”ジャンゴ”と発音します、ディジャンゴとか発音すると大変恥ずかしいので気をつけましょう。。

    Djangoでunit testを書く

    正直Djangoのドキュメントぐう有能なのでドキュメントを参照してほしいんですが、なんとなくこんなことができるよ的なノリで参考程度にtestsの書き方を書いていきます。

    パス

    .
    ├── manage.py
    └── app
    ├── init.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    ├── models.py
    ├── tests.py
    ├── urls.py
    └── views.py

    Djangoでプロジェクトを作ったらだいたいこんな感じだと思いますが、tests.pyにテストを書き込んでいく、もしくは tests ディレクトリを作ってその中に test_hogehoge.pyを作っていくのが一般的っぽいです。ただ実行されるファイルはプロジェクト内のtest*.pyなのでそれさえ満たしてればなんでも良さそう。

    実行

    実行は

    python3 manage.py test

    で行います結果は
    “`

    Creating test database for alias 'default'...
    System check identified no issues (0 silenced).
    ..
    ----------------------------------------------------------------------
    Ran 5 tests in 0.083s
    
    OK
    Destroying test database for alias 'default'...

    みたいな感じで帰ってきます。

    書き方

    下の例では割り算をする関数division のテストコードを書いています。

    test_zero_divisionは0除算をしたとき-1を返すというdivision の仕様をテストしています。test_divisionは割り算が正しく行われるか調べています。asertEqual(a,b) というのはa=bのときテストが成功したと判断します。逆にa!=bだった場合テストに失敗したことを知らせてくれます。

    assert

    上の例でもあった通りテストは assert を使って書いていきます、assertは一致を確認するassertEqual 以外にも不一致を確認するassertNotEqual , Trueであることを確認するassertTrueなど色々な種類があります。もっと見たい人はunittestの公式ドキュメントを参照してください。

    mock

    testsを実行するのは実環境ではないのでどうしても実環境と違いがでてしまいうまくテストできない事が発生します。そんなときmockを使うと特定の関数の機能を上書きすることができます。実際 to2.pwではGoogleのrecaptchaを使っているのですがrecaptchaはunit testsでは再現できません、なのでmockを使いrecaptcha認証をしてるように見せ、テストコードを書きました。

    ↑ブラウザ上で発行されるtokenをgoogleに送信して認証するのでtestsでは実行できない

    @mock.patch('urlshortner.views._verifyRecaptcha', dummy_return_true) でurlshortner.views._verifyRecaptcha 関数を常にTrueを返すdummy_return_true 関数に置き換えて実行しています。

    client

    ちゃっかり上の例でも使ってたんですがtestClientを使うとAPIへのリクエストを再現できます。

    上の例だと/api/urls/に意図しないパラメータのリクエストが投げられたときのステータスコードとエラーメッセージを確認しています。

    まとめ

    いかがでしたか testsの概念となんとなくの書き方を知ってもらえたら幸いです。大体どの言語にもtests用のフレームワークがあると思うので個人で開発するときにテストを導入したり、今年はできなかったですがプロコンの開発にテストを導入することを検討して貰えればと思います(まあ半年間 or 一人開発のプロジェクトでどこまでテストを書く効果があるかわかりませんが…)

  • 2文字.2文字ドメイン(ee.sb)を取得した話

    この記事は東京高専プロコンゼミアドベントカレンダー②1日目の記事です.

    ごめんなさい、明日提出の物理の課題をやっていたら時間が無くなったので後で追記します。ハワイ時間には間に合うようにします…–

    追記: UTC -12 を仮定すると現在12/01 23:52です、ハウランド島とベーカー島の標準時です、ちなみにハウランド島とベーカー島は現在無人島らしいです。

    TL;DR

    ee.sbというドメインを取得しました、

    SEDO.comで売ってるので興味ある人は買ってください、当分は to2.pwに使おうと思っています(まだ使えるようにしていません…) 追記, 使えるようにしました。

    予備知識: ドメインとは

    URLのgoogle.com, google.co.jp…の部分ですこのブログだとlog.u-t.me の部分が当たります。

    このドメインの一番右の部分(com, jp, me)はTLD(top-level domains)と呼ばれています。TLDはIPアドレスやドメインを管理しているICANN(リンク)が管理していて、日本ではJPRSが.jpを管理しています。

    TLDは.jp(日本)や.us(アメリカ)など、国ごとに発行されているccTLD(country-code TLD)とそれ以外の.comや.org, .shop などのgTLD(generic TLD)に分類されます。

    最近ではGMOが新TLD.shopを49億円で落札したり、Googleが.devを開放したりして話題になりました

    で、これが重要なんですがccTLDは2文字, gTLDは3文字以上と決まっています。.me取ってるやんとかツッコミがきそうですが、.meはモンテネグロのccTLDです。

    短いドメインが取りたくなった

    で、ふと短いドメインが取りたくなりました。←

    ドメインは欲しかったら何でも取れるわけではなく当然既に他の人に取られていたら取れませんし, TLDによってドメインの取得条件を定めている場合があります(例えば.jpは日本国内の法人, 個人. .ac.jpは高等教育機関など)。

    で2文字.ccTLD(2文字)の空いてるドメインをgoddady(リンク)のAPIとか使って探したんですが条件に合致するようなドメインはなく、無理かなーとか思って  2文字.2文字 ドメイン 取得 とかでGoogle検索をしてみたらこんな記事を見つけました。

    .sbドメインの存在を知り調べたら色々面白くて、気がついたらドメイン取得してました??? 5859円/yでした。(買ったとき7000円だと思ってたんだけど思ったより安かった??)

    https://twitter.com/yuto_tamur/status/1196058398439043072

    このドメイン、やばい点がいっぱいあってICCANのページに貼られてる管理者のページ(http://www.nic.net.sb/)のdnsがwixに向けられてて、それなのにwixではページが作られてなかったり。

    公式のwhoisのページで無効な証明書を使ってたりします。ロック!!

    レジストラがまともに活動してるかも怪しいので取得できるか怪しかったのですが4日後無事取得することができました(そもそもドメインの取得に数日かかるとか全く思ってなかったけど…)

    https://twitter.com/yuto_tamur/status/1197419851842637824

    ちなみにGandi.netで取得しました、他のドメインはGoogle Domainsで取得してるのでGoogleDomainsで取りたかったんですがGoogle Domainsでは.sbなんてドメイン扱っていませんでした…

    なんで取得でき(てしまっ)たか

    それまで.com.sb, .net.sb, .org.sbでしか取得できなかったものが2016/12に直接取得できるようになったぽいです、まだかなり余ってそうなので2文字.2文字ドメインが欲しい人は今のうちに取っておくのがいいんじゃないんですかね

    https://web.archive.org/web/20171020075812/https://nic.sb/

    取れてしまったので

    とりあえずto2.pwで使えるようにしておきます(まだしてません…)学生に6000/yはきついので売れたらなぁと思ってSEDO.comに出しています、誰か買ってください。。。