0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

404エラーハンドリングのテストでつまずいた経験とその解決策

Posted at

はじめに

ウェブアプリケーションを使用していると、「404 Not Found」というエラーページに出くわすことがあります。例えば、URLを手入力したり、古いリンクをクリックした場合に表示されることが一般的です。このようなエラーメッセージは、ユーザーにとっては不便ですが、適切なエラーハンドリングを実装することで、ユーザーにとってより良い体験を提供することができます。

しかし、実際に404エラーハンドリングをテストする際には、苦戦することもあると思いこの記事では、私が404エラーのテストに取り組んだ経験を通じて、陥りやすいミスとその解決策についてお話しします。

404エラーハンドリングの重要性

404エラーが発生した際、適切なエラーページを表示することは、サイトの信頼性を高めるためにも重要です。ユーザーが存在しないページにアクセスした場合、明確で親切なメッセージを表示することで、他のページへの誘導を行うことが可能になります。
404エラーはテスト設計をする中で確認しておく項目があります。

確認項目

1.settings.pyでDEBUGをオフにする

404エラーページを確認するには、settings.pyファイルでDEBUGをFalseに設定します。これにより、Djangoは404エラー時にカスタムエラーページを表示します。

settings.py
DEBUG = False

2.templatesフォルダにエラーハンドリング用のファイルを作成する

カスタム404エラーページを表示するためのHTMLテンプレートを用意します。例えば、404.htmlというファイルを作成し、ユーザーに親切なメッセージを表示します。

templates/404.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ページが見つかりません</title>
</head>
<body>
    <h1>404 - ページが見つかりません</h1>
    <p>申し訳ありませんが、お探しのページは存在しないようです。</p>
    <a href="{% url 'home' %}">ホームに戻る</a>
</body>
</html>

3.test_views.pyの作成

404エラーが発生するURLに対するテストケースを作成し、期待するレスポンスコードが返ることを確認します。

tests/test_views.py
from django.test import TestCase
from django.urls import reverse

class YourViewTests(TestCase):
    def test_nonexistent_url(self):
        response = self.client.get('/nonexistent-url/')
        self.assertEqual(response.status_code, 404)  # 404エラーが返されることを確認

4.カスタム404ビューの設定

urls.pyでカスタム404ビューを設定します。これにより、404エラーが発生した際に特定のビューが呼び出されるようになります。

urls.py
from django.conf.urls import handler404
from .views import custom_404_view

handler404 = custom_404_view

5.アプリケーションのviews.pyにクラスを設定

404エラーが発生した際に表示する内容を定義したカスタムビューを実装します。

views.py
from django.shortcuts import render

def custom_404_view(request, exception):
    return render(request, '404.html', status=404) 
    # 404ページを返す

つまづいた箇所

実際に確認項目を前提に踏まえた上で、404エラーの処理が期待通りに動作するか試してみたところ、以下のエラーに直面しました。

AssertionError: 404 != 200 : Couldn't retrieve content: Response code was 404 (expected 200)

404エラーを試す試験で200のステータスコードが返却されていました。
原因を特定するのに時間を要しましたが、200を返すケースとして
self.assertContainsを扱っている場合も理由の1つであることがわかりました。
プロジェクト作成の際に、エラーメッセージを返す確認のプロセスとして以下のコードを末尾に加えていました。

  self.assertContains(response, 'ページが見つかりません')

この内容を省略することで無事テストケースをパスすることができました

tests/create.py
  def test_404_error_handling(self):
    # 存在しないページへのアクセス
    response = self.client.get('/nonexistent-url/')
    
    # ステータスコードが404であることを確認
    self.assertEqual(response.status_code, 404)
    
    # エラーページのテンプレートが正しく表示されているか確認
    self.assertTemplateUsed(response, 'test_templates/404.html')
     

まとめ

今回の経験を通じて、カスタム404エラーページを設定するためのステップや、テストケースの重要性を実感しました。特に、テスト中に予期しないステータスコードが返された際には、原因を探ることが重要であり、self.assertContainsの使用に注意が必要であることを学びました。
これらの手順をしっかりと踏むことで、404エラーに対する効果的なエラーハンドリングが実現でき、ユーザーにとって快適なサイトを提供できると感じました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?