2017-11-03 5 views
-1

私はPythonでWebスクレーパーを構築しています。これまでのところ、私は実際のWebサイトでテストしてきましたが、pytestを使って理想的に実行する適切なテストスイートを用意したいと思います。任意のアイデア/例それを行う方法?Python:Webスクレーパーの機能テスト

(おそらく別のプロセスで)いくつかのページを処理するミニHTTPサーバーを起動し、そのAPI関数の1つを呼び出してスクレーパーを実行し、結果を確認してからサーバーをシャットダウンすると思います。それを達成する最も簡単な方法は何ですか?

編集:ここでは、誰かにとって有用である場合に私が見つけた具体的な解決方法について説明します(議論しようとすることなく広すぎて問題を閉じた司会者ではなく、 。

私の(Python 3)コードでは、最初にurllib.requestを使用していました。インターネットで検索したところ、httmockが見つかりましたが、そのライブラリのアドレスはrequestsで、urllib.requestでは機能しません。だから、requestsを使用するようにコードを修正し、私は幸いに私のテストでhttmockを使うことができました。 requestshttmockはどちらも絶対に輝きがあります。

+0

誰かが「あまりにも広すぎる」という質問を締めくくりに投票しました。なぜそれは広すぎるのですか、それをどのように具体的に言い換えることができますか? – piokuc

答えて

1

アクティブなサーバー、特に各テスト後に起動して破棄する予定のサーバーに対してテストの大部分を実行する必要はありません。それはあなたのテストスイートをかなり減速さ​​せ、しばしばランニングテストをより苦痛にさせます。スクレーパの複雑さにもよりますが、スクレーピングロジックの正確さを保証するテストスイートはかなり成長します。

代わりにすばやく読み込むことができる静的コンテンツ(ディスクにキャッシュされたウェブページなど)に対して、スクレーパーのコア機能を実行します。テストextractImageLinksFromPage(page)は、ページコンテンツを供給するためにサーバーを必要としません。ただfile.load(pageContent)にすることができます。

実行中のサーバーに対するHTTP要求機能のみをテストします。

(スクレーパーのユーザーがスクレーパーとやり取りする方法をシミュレートする)いくつかのエンドツーエンドのテストが必要な場合は、サーバーも使用できます。

コンテンツを起動して実行するサーバーを取得する方法はたくさんあります。私が考える最も速いのは、を使用するものでなければならないので、node RESTful APIのgoogleです。 Pythonの世界にいたい場合は、flaskを参照してください。ユースケースのために定型文がありません。