エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【GCP】GCEをまるごとバックアップ。イメージを作成【405日目】

スナップショットはこちら

www.nyamucoro.com

イメージって?

インスタンスの構成とか、ぜーんぶまるっとコピー。バックアップ。

スナップショットとの違いは、あっちはハードディスクとかのデータで、ネットワークの構成とかは保存されてないよ。

設定

  1. 保存するイメージの名前をつける
  2. ソースを選ぶ(スナップショットを選択もできるけど、今回は今動いてるインスタンスを選ぶよ)
  3. ソースディスクを選ぶ(対象の今動いてるインスタンスを選ぶよ)

このとき、動いてるインスタンスだと、危ないからインスタンス止めてね!って言われる。

動いたままバックアップも取れるけど、私は怖いのでインスタンスを止めてから作成しました。

f:id:willow710kut:20181123004233p:plain

お金は?

こっちは、スナップショットと違ってお金かかるよ!

でも、めっちゃ高いとかじゃないので、一応確認して使ってね。

これなにに使うん?

サーバーを同じのを作りたいときに使ったりとか。

あと、インスタンスグループのために、インスタンステンプレートにしちゃうとか。

ってことで、この次はインスタンステンプレートを作るよ!

【Mockery】メソッドチェーンで繋がった関数をモックする【404日目】

こんなとき

プログラムで、テストを書こうと思った。

\Validator::make($data, [
    'email' => 'unique:users,email',
])->fails();

これ、Validatorのmakeをモックしたとしても、その後のfailsもモックできていないと、うまくテストできない。

makeとfailsを同時にモックしたい。

こう書く

\Validator::shouldReceive('make->fails')->once()->andReturn(true);

'make->fails'これで、makeのあとのfailsをモック出来る。

【Mockery】テスト対象のメソッド内で、app関数で値が呼び出されているとき【403日目】

こんなとき

class Hoge
{
    public function fuga()
    {
        return app('some_class')->someMethod();
    }
}
class SomeClassProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('some_class', function () {
            return new SomeClass();
        });
    }
}

appでインスタンス呼ばれてるうううう

テスト書くときどうしよう?

使うもの

$this->app->instance(Hoge::class, $mock);

テストコード

public function testFuga()
{
    $mock = Mockery::mock('SomeClass');
    $mock->shouldReceive('someMethod')
        ->once()
        ->andReturn('hoge');

    $this->app->instance('some_class',$mock);

    $this->assertSame($this->hoge->fuga(), 'hoge');
}

何をしているのか

appの結合を新しく宣言しました。

通常時は、SomeClassProviderで'some_class'に対してsingleton結合されていました。
使われるクラスは、 singletonで作られた、SomeClassのインスタンスです。

これに対してテストコード内では、'some_class'に対して、$mockのインスタンスを返す、instance結合を宣言しました。
なので、テスト実行時にapp('some_class')をすると、$mockのインスタンスが返されます。

これによって、$mockによる関数実行が行えます!

参考

サービスコンテナ 5.3 Laravel

appではなく、newされてる場合

www.nyamucoro.com

【Mockery】テスト対象のメソッド内で、別クラスがnewされてる時のモック【402日目】

こんなとき使う

テスト対象の関数で、以下のように新しいインスタンスが作成されてる。

class Hoge
{
    public function fuga()
    {
        return new SomeClass()->someMethod();
    }
}

作成されたSomeClassのsomeMethodを、どうにかしてモックしたい。

overload

テストコード

Mockery::mock('overload:SomeClass')->shouldReceive('someMethod')
    ->once()
    ->andReturn('hoge');

これで、SomeClassインスタンスが新しく生成された時に、モックインスタンスにすり替わる。入れ替わる。

なので、Hoge::fuga()の結果が'hoge'に変わってます。

お疲れ様でした。

参考

テストダブル作成:Mockery1.0

appでインスタンスを呼び出されている場合

www.nyamucoro.com

【一週間振り返り】やることやりつつ、平凡な一週間でした【401日目】

1.今週一週間の感想(ざっくり)

勉強もしつつ、渡された仕事もやりつつ、大きなことはやってないけど、順調な一週間でした。

2.良かったこと

1.GCPの勉強少しやれた

2.電動スクーターのバードを教えてもらった。電動スクーターを放置する人が現れたけど、それを片付けるという新たな職が生まれたことも知る。サービスを作ることで、常識を変えるのは、Uberもだけど、現実的な手段の一つだと知る。

3.ブログで書いた、Controllerとかの分け方で、アドバイスもらえた!アウトプット大切。

3.もっとこうしたかったこと

もう少しGCP勉強したかったけど、まあゼロじゃなかったので自分を少し褒める。

4.新しく気づいたこと

常識というものと戦うときに、常識を新たに作って、今の常識と距離を取るだけじゃなく、常識をみんなが変えたくなるような何かを作るのもありなんだなーってこと。ただ、これもただサービス出しましたね、で終わらないよう、この集団の場合でもいっぱい考えることがありそうですね。

5.来週したいこと

GCPの勉強!

あと、チームというものについて、自分のスタンスを見直してみる。

6.その他

勉強して、そして少しずつやりたいことに向かって進むって楽しいですね!

【GCP】GCEのバックアップ、スナップショットを撮る【400日目】

こんなときに使う

GCEでサーバー用意したよ!

でも、これが万が一壊れたらどうしよう。

でも、VMインスタンスじゃなくて、インスタンスグループに切り替えたい。

そんなとき。バックアップとって、いつでも同じものを作れるようにしよう!

やり方

  1. GCPのコンソールに入る
  2. 左のメニューから、コンピューティング>Compute Engine>スナップショットを選択
  3. スナップショットを作成を選択
  4. 名前をつけたりしよう
  5. ソースディスクの項目に、『すでに作ったVMインスタンス等が選べるので、スナップショットを撮りたいインスタンスを選択』
  6. 作成!

f:id:willow710kut:20181118002223p:plain

料金はかかるの?

かかるよ!

でも、2018/11/18時点で、5GBまでは無料でスナップショットを保存出来るよ!

cloud.google.com

次は、昨日の記事と合わせて、すでにあるインスタンスを、インスタンスグループにしてみよう。

【Laravel】ファサードのモックでCannot redeclare Mockeryが出る対応【399日目】

ファサードをモックしようとした

テストを書こうと思って、ファサードでモックしようとした。で、こう書いたら・・・

$mockClass = Mockery::mock(‘Validator’)->shouldReceive(‘make’);

エラーがこれ

Cannot redeclare Mockery_0_Illuminate_Support_Facades_Validator::shouldReceive()

エラーの意味

同じ関数を定義してるって感じ。

すでにこの関数あるぞーって言われてる・・・

あれ?つまり・・・

解決方法

Validator::shouldReceive('make')

デフォルトのファサード、すでにshouldReceive実装済みってことね・・・
なので、わざわざMockery通して新しくshouldReceiveを定義しなくていいよって話でした。

おつかれさまでした・・・

【GCP】GCEのインスタンスグループの作成【398日目】

インスタンスグループ?

単一のインスタンスじゃなくて、同じようなインスタンスを、必要に応じて用意することで、一個が死んでも大丈夫ーみたいにするやつ。

死んでないかな?みたいなのをチェックしたり、負荷かかったら、予備を用意したりします。

手順例

基本は画像みたいな感じをイメージ。てかGoogleの説明が丁寧過ぎて言うことがない。

打ち込むときに考えてたことを以下に。

  1. GCEのインスタンスグループを選択
  2. インスタンスグループを作成をクリック
  3. ロケーションはお好みで。私はとりあえず日本に。たくさん通信・・・来ないよね?
  4. いろいろ考えたくないので、マネージドインスタンスグループでいい感じにしてもらう
  5. インスタンステンプレートで、困ったときに作るインスタンスの型を決定
  6. 自動スケーリングオンにして、急に凄い通信が来ても耐えれるように
  7. 条件は、めっちゃCPU動いているとき
  8. 自動修復は、別に下へ。

f:id:willow710kut:20181115222909p:plain

ヘルスチェック設定

ヘルスチェックは、たまーに通信して、サーバー落ちていないかを確認してくれるやつ。

  1. 名前つける
  2. プロトコル、ポートはインスタンスがちゃんと許可しているものを。
  3. ヘルス条件は、書いている通り。

何秒毎にチェックして、返事を何秒待って、そして何回連続で返答したらOK。何回連続で返事しなかったら怒るよ!ってやつ。

f:id:willow710kut:20181115221910p:plain

作成!

作成を押したら、インスタンスが作成されます。

しばらくすると、いつもの単一インスタンスの操作と同じようにSSHとか操作が出来るようになります。

おつかれさまでした。