PUROGU LADESU

ポエムがメインのブログです。

【Django】テンプレートのVSCode拡張をどれにするか悩む

Djangoのテンプレートを書くためのExtensionはどれが良いのかさまよっていたけど、とりあえずコレにしてみたという話。

ハマった点

最初にスターが多いこちらなどを入れてみたのだけれど、なんでかhtmlの補完が効かなくなってしまって嫌だった。

marketplace.visualstudio.com


htmlの補完機能はこれらを使っているが、コイツらが使えなくなるのは嫌だ。

marketplace.visualstudio.com

marketplace.visualstudio.com

というわけでコレ

marketplace.visualstudio.com

formと打てばフォームのhtmlタグが入るし、blockと打てばテンプレートのタグが入る。いい感じ!

【python】仮想環境切り替え

venv

pythonについてくるやつです。

仮想環境: Python環境構築ガイド - python.jp

python3 -m venv .newenv

# 有効化
source .venv/bin/activate 
. .venv/bin/activate
# 無効化
deactivate

sourceと.はシェルを実行するコマンドです
venv --claerで初期化
削除はフォルダを消す

virtualenv

仮想環境作成時に使うpythonバージョンを指定できる。
切り替えはできずすでにあるpythonにリンクできるだけ?

python3 -m pip install virtualenv

virtualenv -p python3.8 newenv
source /newenv/bin/activate

# 無効化
deactivate


Python の実行環境を切り替えて使用する (virtualenv) Python3.2まで | まくまくPythonノート

pyenv-virtualenv

pyenvを使ったpythonバージョンの切り替えができるよう。
仮想環境構築と使うpythonバージョンを指定できる。

仮想環境 バージョン管理 まとめ Python - Qiita

pyenvとpyenv-virtualenvの自分流使い方 - Qiita

【Python】Anaconda環境のパッケージの利用

Anaconda環境のパッケージの利用

Managing packages — conda 4.9.2.post26+f52f2bf4 documentation

使い方

conda install xxx
conda remove xxx

conda listコマンドはインストールしたパッケージのリストを表示する。
取得元チャネルも表示。

conda list

channel

channelはローカル、リモートなどパッケージの取得元リポジトリです。
別のchannelに同じパッケージがある場合は、衝突を避ける必要がある。
基本的に同じパッケージはバージョンが新しいほど優先される。
通常はデフォルト、channelを指定して有効化する。pipyもチャネルの一つ。

どこからパッケージを探すか(conda,conda-forge,pip)

パッケージを利用する場合は、まずcondaでパッケージを探します。
condaにない場合は、conda-forgeから探します。
conda-forgeにもない場合はpipを使ってインストールします。
ただしpipを使った場合、condaとの差異により互換性の問題が発生する場合があります。
ただcondaは可能な限り互換性を保つよう動作しようとします。

pipもcondaもAnadoncaに含まれているのでインストールの必要はありません。

  • conda-forgeからインストール

Conda channels — conda 4.9.2.post26+f52f2bf4 documentation

conda install xxx --channel conda-forge

インストール可能なパッケージを調べる

conda search python

venvはpythonに含まれるものだが、condaにとってはpythonも依存関係の一つとなる。

pipをconda environmentで使う

Managing environments — conda 4.9.2.post26+f52f2bf4 documentation

conda environmentを作ると同時にpipを入れる

conda install -n xxxx pip
conda activate xxxx
pip install xxx

【Python】Anaconda仮想環境の切り替え

conda environment

これはcondaの仮想環境です。複数用意することが出来てそれぞれの仮想環境は影響を受けません。デフォルトではbaseという仮想環境が用意されます。
pythonのバージョンやcondaやpipでインストールするパッケージも分けることが出来ます。

Conda environments — conda 4.9.2.post26+f52f2bf4 documentation

Managing environments — conda 4.9.2.post26+f52f2bf4 documentation

  • environmentの確認
conda info --envs
  • 仮想環境を使う

名前を指定しない場合はbase環境を有効化します。active化するとターミナルの左はしに(base)などと名前が表示されます。

conda activate
conda activate xxxx
  • 仮想環境を使い終わる

通常のpythonの参照に変わります。

conda deactivate
  • 新しい仮想環境を作成と削除

pythonのバージョンを指定できる。

conda create -n myenv
conda create -n myenv python=3.6
conda remove -n myenv

環境を配布できる。(conda, pip両方対応)

conda env export > environment.yaml
conda env create -f environment.yaml

VSCodeで利用する場合

python pathをanacondaのパスに設定します。複数環境を利用する場合はworkspaceの設定を追加してsettings.jsonを置いたほうが良いと思います。

which python
/opt/anaconda3/bin/python

【Python】pytestをVSCodeで動かす

unittestはunittest.TestCaseを継承しないといけなかったりするが、少しシンプルに書けるみたい。

VSCodeから使う

  • Python Run All Tests を実行すると、テストに使うライブラリからpytestを選択、対象フォルダも選ぶ
  • settings.jsonがプロジェクト内に作成される
  • 結果はTestタブから見れる。ここで実行もできる。

注意点

  • メソッドは必ずtest_xxxにする
  • クラスは必ずTestXxxにする

【VSCode】pylanceが壊れているのか?

VSCodeの設定をいじくっていると、ファイルの先頭部分に波線が出るようになり、コード補完も効かなくなってしまった。

Internal error parsing ...

となっておりコードの実行自体は問題がないので、VSCodeがというかpylanceがコードを解析できていないようだった。ちょっと前のバージョンを入れたら治った。

最初はちゃんと動いていたのに、知らん間に新しいバージョンが入っちゃったんだろうか。イライラしてしまいますね。。

【Swift】UITest/XCTest

基本

XCTest
  • 画面操作をシミューレートして統合テストが出来ます。(単体テストはUIのついてない方のTestを使う)
  • 新規ファイルの追加でUITestCaseを追加する。
  • testXXXXXでテスト項目を作る。
  • setUpWithErrorは各テストケースの実行前に呼ばれ、アプリ立ち上げ、画面遷移、データ投入などを行う。
  • tearDownWithErrorは各テストケースの実行後に呼ばれ、データ削除などを行う。

レコーディングのやり方

テストケースを選択し、Xcodeのエディタの下のバーにある赤丸のRecordUITestボタンをクリックすると、画面操作した内容でコードが自動作成される。

func testTest() throws {
    // ここにカーソルを合わせて、赤丸ボタンRecordUITestをクリック
}

テストケースの書き方

XCTAssertXXXを使って正しいかどうかチェックします。
タイトルで指定できますが、identifierをつけたほうが良いと思います。

// 画面に必要な項目があるかチェック
func testLayoutIsCorrect() throws {
    let app = XCUIApplication()
    // アプリという名前の項目を探す
    let titleLabel = app.staticTexts["アプリ"].exists
    XCTAssertTrue(titleLabel)

    let buttonLogin = app.buttons["ログイン"].exists
    XCTAssertTrue(buttonLogin)

    let textEmail = app.textFields["Email"].exists
    XCTAssertTrue(textEmail)
}

アプリに同じ名前の項目があった場合はエラーになりますので、viewを指定してからその中のコントロールを指定するほうが良いです。
テキストフィールドに入力する場合は、キーボードを開いたりして時間がかかるので、sleepを使うとうまくいきます。

func testFillsAllInputs() throws {
    
    let app = XCUIApplication()
    // ビューを指定する
    let view = app.otherElements["SignUpFormView"]
    
    let username = view.textFields["userNameField"]
    username.tap()
    sleep(2)
    username.typeText("test user")
    
    let email = view.textFields["userEmailField"]
    email.tap()
    sleep(2)
    email.typeText("test457@test123.com")

    view.buttons["登録"].tap()
}
func testShowsNewView() throws {
    let app = XCUIApplication()
    app.buttons["登録"].tap()
    // 遷移先の画面をナビゲーションバーの名前で確認(2秒まで待つ)
    let viewTitle = app.navigationBars["ユーザー登録"].waitForExistence(timeout: 2)
    XCTAssertTrue(viewTitle)
}