Testing: Mock Object

Khoirul Khuluqi Abdulloh
Scrum Booster
Published in
2 min readMay 21, 2019

Pada pengembangannya, tim Scrum Booster menggunakan Django Rest Framework sebagai webservice dan Flutter sebagai Front End. Dalam pengembangannya, diperlukan berbagai testing untuk menguji apakah produk yang diinginkan sudah sesuai baik dari segi fungsionalitas maupun tampilan. Mock adalah “stub” object ajaib yang dapat dikonfigurasi untuk dapat berperilaku seperti yang kita inginkan. Mock object diprogram dengan harapan memenuhi spesifikasi dari kembalian suatu calls.

Mock Object pada Django

import unittest
from rest_api.models import Problem

class TestCase(unittest.TestCase):
def test_problem_to_str(self):
instance = Problem.objects.create(title="Masalah")
self.assertEqual(instance.__str__(), "Ini problem berjudul Masalah")

Pada contoh sederhana ini, terlihat bahwa unit test tersebut melakukan sesuatu yang tidak perlu dilakukan. Method create() akan membuat instance dari Problem untuk mempopulasi table pada database. Jadi bagaimana caranya supaya kita hanya mengetest method Problem.__str__?

import mock
import unittest
from rest_api.models import Problem

class TestCase(unittest.TestCase):
def test_problem_to_str(self):
mock_instance = mock.Mock(spec=Problem)
mock_instance.title = "Masalah"
self.assertEqual(Problem.__str__(mock_instance), "Ini problem berjudul Masalah")

Dengan memberikan argumen “spec” pada konstruktor Mock, kita memberikan instruksi kepada objek mock untuk merespon layaknya objek Problem. Kemudian kita meng-assign nilai pada tiap instance variable objek tersebut. Setelah itu, Mock object tersebut sudah dapat digunakan untuk testing.

Penggunaan Mock object dalam testing ini mempunyai kelebihan berupa eksekusi testing yang lebih cepat

Mock Object pada Flutter

Pada Flutter, konten dalam aplikasi ditampilkan melalui widget-widget. Widget testing berguna untuk memastikan bahwa konten yang ditampilkan sudah sesuai harapan. Widget testing pada Flutter bekerja dengan cara me-render widget yang akan di test secara temporary, lalu mengecek apakah testing yang disediakan mampu dijalankan dengan baik.

Berikut adalah implementasi Widget Testing pada widget Drawer yang dilakukan oleh tim Scrum Booster.

Widget makeTestableWidget({Widget child}) {
return MaterialApp(
home: child,
);
}

method diatas adalah method untuk me-render widget yang akan ditest. Method tersebut memiliki parameter berupa widget yang akan ditest. Kemudian akan dikembalikan kembali widget tersebut yang sudah dibungkus dengan parent MaterialApp.

Berikutnya akan diuji bagaimana drawer ditampilkan, tombol apa saja yang ditampilkan, dan benar atau tidaknya logo Scrum Booster yang digunakan.

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:ScrumBooster/initScreen/HomeScreen.dart';

void main() {
final HomePage home = new HomePage();

testWidgets('Home Screen Drawer Test', (WidgetTester tester) async {
GlobalKey<ScaffoldState> scaffoldKey = home.getScaffoldKey();
await tester.pumpWidget(makeTestableWidget(child: home));
Key menu1 = new Key("Home");
Key menu2 = new Key("Ceremonies");
Key menu3 = new Key("Problems");
Key menu4 = new Key("Glossary");
Key menu5 = new Key("Pop Quiz!");
Key menu6 = new Key("About");

// Tap the 'burger menu' icon and trigger a frame.
scaffoldKey.currentState.openDrawer();
await tester.pump();

// Verify all the sidebar menu.
expect(find.byKey(menu1), findsOneWidget);
expect(find.byKey(menu2), findsOneWidget);
expect(find.byKey(menu3), findsOneWidget);
expect(find.byKey(menu4), findsOneWidget);
expect(find.byKey(menu5), findsOneWidget);
expect(find.byKey(menu6), findsOneWidget);
});
}

--

--