WebアプリのテストでUIテストと統合テストを切り離そうとしたけど、ちょっと考えなければならなかったハナシ

 Webアプリのテストで、Seleniumを使ったUIテストを書いておいた。テスト内容として、フォームを埋めて、POSTでコントローラが意図通りに動いて、のぞんだレスポンスが返ってくるかまでテストしていた。UIテストと同時に統合テストの役割をになっていたので、役割をフォームのテスト程度に抑えて、別の統合テストを用意したかった。だからPython + requests( +lxml)で、直接RESTリクエストを投げてコントローラを動かすテストを書いてみた。
https://github.com/hMatoba/tetsujin/blob/master/tetsujin/PythonIntegtationTest/tests/master_test.py


 ただGETを投げてレスポンスを確認するようなテストもSeleniumでやっていたのだが、これをrequests + lxmlにしたところパフォーマンスは数十倍を超えたのでまあいい手ごたえ。ただSeleniumを使ったテストでも、一つのメソッドにつき一秒もかかっていないのでそんな神経質にならんでもいいかとも思う。
 考えなければならんかったのはPOSTを行うフォームのテスト。POSTする内容をrequestsで作る。それをPOSTで投げる。なのだが、フォームなのでもちろんCSRF対策が入っていて、これを考慮せんといかんかった。
 ASP.NET Core MVCでのCSRF対策は備え付けのものを使った。
Prevent Cross-Site Request Forgery (XSRF/CSRF) attacks in ASP.NET Core
CSRF対策のトークンを確認したところ、フォームには”__RequestVerificationToken”の名前で、クッキーには”.AspNetCore.Antiforgery.9TtSrW0hzOs”のキーで値が入っていた。だが、長さ190文字中、先頭30文字弱のみ一致しており、それ以降は異なっていた。これに関して自分で適当に作ってフォームとCookieにセットするのはやめておいたほうがよさそう。ここはSeleniumを使ってブラウザでフォームを動かしたほうが、自分でごにょごにょやるより手っ取り早いだろう。

 まとめ。WebアプリのUIテストと統合テストをわけたかったので、RESTリクエストを作ってコントローラを動かすテストを追加してみた。GETでレスポンス確認する場合は狙い通りだった。いっぽうでPOSTでCSRF対策が入っている場合、フォームやクッキーにその対策の対策を入れる必要に気づいた。そうすると、そこのあたりはSeleniumを使ってブラウザを動かすテストにしておくのが余計なことを考えずに済んで手っ取り早いだろうという知見を得た。
comment: 0