JavaRush /Java Blog /Random-JA /就職のためのテスト課題、考えてみましょう。
timurnav
レベル 21

就職のためのテスト課題、考えてみましょう。

Random-JA グループに公開済み
友人の皆さん、こんにちは。ロシアの会社で Java 開発者のポジションのテスト タスクを解決した私の経験を共有したいと思います。課題の主な機能の実装は特に難しいことではないとすぐに言いますが、いつものように詳細や小さなことが重要なので、時間通りに提出することができませんでした。課題については何も答えられませんでした。空き状況について送った時にはすでに埋まってました。タスクを調べて、私が要求されたことをすべて実行したかどうかを確認することをお勧めします。そして、作り方がわからない人のために、私がどのように対処したかについて水をたっぷり加えます。興味のある方は猫へようこそ。 すぐに言っておきますが、ソリューション全体をここには投稿しませんが、初心者向けの説明がたくさんあります。私の吐露を読むことに興味がない人は、 github にあるプロジェクトを 参照してください。タスク自体のテキスト。
テストタスクNo.1
説明: API サーバー (JSON HTTP API) 開発ツール: Java フレームワーク: Play Framework 2.4 (以降) または Spring Boot 1.2.3 (以降) データベース: MySQL プロトコル: HTTP、ポート 80 機能 (リクエスト):
  1. ローダ。
    • ファイル(JPGアバター画像)をサーバーに転送します。
    • 画像をサーバー上のディレクトリに保存します。
    • サーバーの応答はイメージの内部 URI です。
  2. 新しいユーザーを追加します。
    • 当社はユーザーの個人データ (画像の URI、ユーザー名、電子メールなど) をサーバーに転送します。
    • 情報はデータベースに保存されます。
    • サーバーの応答は、新しいユーザーの一意の ID です。
  3. ユーザーに関する情報の取得。
    • 固有のユーザーIDをサーバーに送信します。
    • データベースから情報を読み取ります。
    • サーバーの応答はユーザーの個人データです (上記を参照)。
  4. ユーザーステータスの変更(オンライン、オフライン)。
    • 固有のユーザー ID と新しいステータス (オンライン、オフライン) をサーバーに転送します。
    • ユーザーのステータスを変更します。
    • サーバーの応答 - 一意のユーザー ID、新しいステータスと以前のステータス。
    注: サーバーは外部 API/データベースにクエリを実行しています。これは単純化されたテスト タスクであるため、シミュレートされたアクセスと 5 ~ 10 秒の時間遅延を備えた「スタブ」を実装する必要があります。
  5. サーバー統計。
    • サーバーにパラメータを転送します: 1. クライアントのステータス (オンライン、オフライン、または不在)、 2. リクエストの一意の ID (タイムスタンプ) (存在しない場合があります)
    • サーバー応答は、ステータスと画像 URI、およびリクエストの一意の ID (タイムスタンプ) を含むユーザーのリストです。
    注: リクエストにパラメータが含まれている場合、サーバーはパラメータによって応答をフィルタリングする必要があります。リクエストに (以前に受信した) リクエストの一意の ID (タイムスタンプ) が含まれている場合、サーバーは、この一意の ID (タイムスタンプ) 以降にステータスが変更されたユーザーのみを返す必要があります。
必須要件:
- RESTful。- すべてのデータは JSON 形式です。- API サーバーは、リクエスト 3 と 5 の優先順位が (リクエスト 1、2、4 に対して) 最も高く、できるだけ早く完了する必要があることを考慮して設計する必要があります。- エラー処理。
オプションの要件 (望ましい):
- コードのドキュメント。- API サーバーのアーキテクチャは、高負荷とスケーリングを考慮して設計する必要があります。- テスト。
テスト結果:
- テスト タスクの結果はアーカイブで提供され、その展開に関する詳細な手順が提供される必要があります。テスト タスク用の Docker コンテナを構築するには、Dockerfile を添付することをお勧めします。github.com にダウンロードできます。- 作成された API の簡単なドキュメント (リクエストのリスト、リクエストパラメータ、リクエストフォーマット、レスポンスフォーマットなど) を含める必要があります。- 設計、プログラミング、ドキュメントなどのコンテキストでのテスト タスクに費やした時間に関する情報。なお、この試験課題は知識やスキルの評価のみを目的としており、完成品(APIサーバー)の作成を目的としたものではないため、説明や理由を添えて簡略化することは認められます。
注意深い経験豊富なプログラマーは次のセクションを飛ばしていただいても構いません。ここではタスク自体のテキストを扱います。タスクの「ヘッダー」は理解に何の困難も引き起こすものではないので、私の選択は Spring Boot に落ちたとだけ言っておきますが、それはすでに Spring Boot で何かを実行したからではなく、Spring Boot を使用して実際のプロジェクトをすでに完了していたからです。 Spring (ただし、その単純さのために Boot は存在​​しませんでした)。サーバー機能別: 1) ファイル ダウンローダー。ここでは基本的に複雑なことは何もありません。画像が通常どのようにサーバーに保存されるかを理解する必要がありました。最も便利な方法は、画像を特別なディレクトリに置くことであることがわかりました。以下で具体的な実装を見ていきます。2) 新しいユーザーを追加する簡単な操作です。CRUD アプリケーションを作成したことがある場合はサポートしてくれるでしょう。そうでない場合は、以下のすべてが表示されます。3) ユーザーに関する情報の取得。質問はありません - すべてが明らかです。4)ユーザーステータスの変更。タスクの最初の 2 つのポイントはすぐにわかりますが、外部リクエストはどうなるでしょうか?100g がなければ理解することは不可能です。今でも正しく理解できたかどうかは 100% 自信がありません。詳細は以下をご覧ください。5)サーバー統計。これも興味深いですね。最初のポイントは、パラメーターのさまざまなオプションを使用してメソッドを実装することを提案していますが、これがコントローラー メソッドである必要があることを考えると、これを行う方法はまだ明確ではありません。2 番目のポイントは、しばらくしてステータスが変化したすべてのユーザーに質問します。これは明らかなようですが、微妙な点があります。
はじめる
ああ、このタスクに取り組んでいる間、何度このフレーズを読んだことでしょう。Spring でプロジェクトをセットアップする方法を理解しようとしたことはあるものの、何らかの理由で Spring Boot を試したことがない場合は、おめでとうございます。これから私が書く内容に単純に満足していただけるでしょう。プログラマーがプロジェクト間で非常に大量のコードを転送していたということをどこかで読みました。これはテンプレート コードです。データベースへの接続やサーブレット マッピングなどの設定です。これにより、たとえば、コードの量を減らすことができます。操作するためのテンプレート コード データベースには JPA/Hibernate を使用しており、一部のテンプレートは隠されていますが、それらを構成するには、やはり XML ファイルまたは構成クラスを記述する必要があります。小規模なプロジェクトの場合は、コードを書くことになるだけでなく、その逆も同様です。次に、Spring での JPA の使用についてまとめます。プロジェクトはたくさんありますが、最も便利なのは、もちろん Spring Data です。これは非常に大規模なプロジェクトで、JPA や NoSQL などのさまざまなプロジェクトを含む、おそらくあらゆるものと連携できます。これは信じられないほど魔法のようなもので、プロジェクトで使用します。Spring を使用すると、データベース接続設定がほぼ不要になります。Spring がすべてを行ってくれます。必要なのは、トランザクション性、キャッシュに関する必要な注釈を追加することだけです。特殊な場合には、コンテキスト構成内のその他の設定を Google (他の設定を参照) するだけです。しかし同時に、ほとんどの初心者開発者は Spring でプロジェクトを作成する方法をまったく知りません。localhost:8080/* で始まるリンクに従ってプロジェクトを実行し、ブラウザーで結果を取得するように構成する方法を完全に知っている人は誰もいません。そして、Spring Boot が登場します。Spring Boot については、具体的な例を挙げて説明するほうがよいでしょう。ブランクから始めましょう。Spring Boot プロジェクトを作成するために、Spring 開発者はテンプレートを作成するための「コンストラクター」を考案しました。Web サイトで使用することもできますが、お気に入りの IDE、Intellij IDEA で使用する方がはるかに簡単です。ファイル -> 新規 -> プロジェクト ウィンドウで Spring Initializr タブに移動し、jdk と URL https://start.spring.io を設定し、インターネット接続を確認します。名前を選択し、次に使用するテクノロジを選択します。最初の段階では WEB のみが必要です。その横にチェックを入れると、プロジェクトが作成されます。Maven がすべての依存関係を取得するには、アイデアで [Maven] タブを開き、[更新] ボタンをクリックする必要があります。クライアント/サーバー通信のすべての設定が含まれた既製のアプリケーション テンプレートを受け取りました。第一印象を得るために、コントローラー クラスを作成してみましょう (MVC についてはおそらく誰もが聞いたことがあるでしょう)。すべての Spring アプリケーションでは、コントローラーは非常に単純な設計になっています。これは @Controller アノテーション (@RestController などのプレフィックスが可能) でマークされたクラスであり、このクラスは受信リクエストの処理を担当します。コントローラーが何らかのアドレスのリクエストを認識できるようにするには、このアドレスをコントローラーのメソッドにマップする必要があります。 import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/hello") public class DemoController { @RequestMapping(method = RequestMethod.GET) public String halloWorld() { return "Hello World!"; } @RequestMapping(value = "/{name}", method = RequestMethod.GET) public String halloName(@PathVariable("name") String name) { return "Hello, " + name + "!"; } } ここで何が起こっているのか見てみましょう。 @RestController。まさに上で書いた注釈と同じです。REST コントローラーを使用するのは、結果をすぐに確認したいのですが、.jsp ページを書きたくないからです (すごい)。ブラウザーで結果を文字列としてすぐに確認する方が簡単です。 @RequestMapping は単なるアドレスへのバインディングです。パブリック アドレスのプレフィックスは localhost:8080 になります。ご覧のとおり、クラス全体が /helloアドレスでハングします。これは、このクラス内のすべてのメソッドに接頭辞 localhost:8080/hello が付いていることを意味します。次はクラスの最初のメソッドで、独自のマッピングで Http プロトコル メソッドが示されています - GET リクエスト (HTTP プロトコル メソッドについては自分で読んでください) これは何を意味するのでしょうか? アドレス localhost:8080/hello に GET リクエストを送信すると、「Hello World!」という文字列の形式で応答が返されます。確認してみましょう。DemoApplication クラスには、Spring コンテキスト全体を単独で起動すると言える素晴らしいアノテーションが 1 つあります - @SpringBootApplication です。このクラスの main メソッドは魔法になります。SpringApplication に隠されているすべての魔法を起動するだけです。このクラスのコンテキスト メニューを呼び出すと、オプションが Run 行に表示されます。緑色のマークを付けて早めに起動することをお勧めします。コンソールはより見栄えが良くなり、将来的にはログを直接読み取ることが容易になるでしょう。アプリケーションを起動しましょう。コンソール出力が停止すると、コンソールに次のように表示されます。
2015-09-02 09:25:36.895 情報 5844 --- [メイン] sbcetTomcatEmbeddedServletContainer : Tomcat がポート: 8080 (http) で開始されました 2015-09-02 09:25:36.900 情報 5844 --- [メイン] demo.DemoApplication : **** 秒で DemoApplication を開始しました (JVM は 15.501 で実行)
ここで、「****」はアプリケーションの起動時間です :) その後、任意のブラウザ (または CURL、またはその他の使用するブラウザ) で、コントローラ メソッドがマップされたアドレスを入力する必要があります。
ローカルホスト:8080/こんにちは
ブラウザには正規のものが表示されるはずです
「こんにちは世界」
ここにあなたのためのウェブアプリケーションがあります! コントローラーに別のメソッドがあることに気付いた場合は、そのメソッドには独自のアドレス マッピングがあり、プレースホルダーが現在のアドレスに追加されます。これは Spring によってパラメータとしてメソッドに渡されます。@PathVariable アノテーションがこれの原因であると推測するのは難しくありません。リクエストに応じて
ローカルホスト:8080/こんにちは/あなたの名前
ブラウザが表示します
こんにちは、あなたの名前です!
Spring Boot の基本を整理しました。次に、データベースを添付しますが、それは次の投稿で説明します。 ありがとうございます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION