diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..6c2ff60b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "githubPullRequests.ignoredPullRequestBranches": [ + "master" + ] +} \ No newline at end of file diff --git a/app.py b/app.py index 36721a06..010d22bc 100644 --- a/app.py +++ b/app.py @@ -1,14 +1,56 @@ -import os from flask import Flask app = Flask(__name__) @app.route("/") -def main(): - return "Welcome!" +def home(): + return """ + + + Selamat Datang! + + + +

🚀 Selamat datang di aplikasi web Flask!

+

Hai, saya Iqbal Yusanta (A710230023), ini adalah proyek praktikum saya menggunakan Python Flask.

+

Silakan coba tombol di bawah ini untuk melihat halaman lain:

+ Ke Halaman About + + + """ -@app.route('/how are you') -def hello(): - return 'I am good, how about you?' +@app.route("/about") +def about(): + return """ + + About + +

📄 Halaman Tentang

+

Aplikasi ini dibuat oleh Iqbal Yusanta untuk latihan menggunakan Flask.

+ ⬅️ Kembali ke Beranda + + + """ if __name__ == "__main__": app.run(host="0.0.0.0", port=8080) + + + diff --git a/docs/uml/classes_flask_app_nama.png b/docs/uml/classes_flask_app_nama.png new file mode 100644 index 00000000..bcaf83aa Binary files /dev/null and b/docs/uml/classes_flask_app_nama.png differ diff --git a/docs/uml/erd.png b/docs/uml/erd.png new file mode 100644 index 00000000..f85ca0d1 Binary files /dev/null and b/docs/uml/erd.png differ diff --git a/docs/uml/schema.dbml b/docs/uml/schema.dbml new file mode 100644 index 00000000..3e8f4431 --- /dev/null +++ b/docs/uml/schema.dbml @@ -0,0 +1,12 @@ +Table users { + id int [pk] + username varchar + password varchar +} + +Table items { + id int [pk] + name varchar + description text + user_id int [ref: > users.id] +} diff --git a/docs/uml/sequence_create_item.png b/docs/uml/sequence_create_item.png new file mode 100644 index 00000000..b4400f13 Binary files /dev/null and b/docs/uml/sequence_create_item.png differ diff --git a/docs/uml/sequence_create_item.puml b/docs/uml/sequence_create_item.puml new file mode 100644 index 00000000..5e90762b --- /dev/null +++ b/docs/uml/sequence_create_item.puml @@ -0,0 +1,12 @@ +@startuml +actor User +participant "Create Page" as CP +participant "Item Controller" as IC +participant "Database" as DB + +User -> CP: Fill item form +CP -> IC: Submit create_item() +IC -> DB: Save to database +DB --> IC: Success +IC --> CP: Show confirmation +@enduml diff --git a/docs/uml/sequence_login.png b/docs/uml/sequence_login.png new file mode 100644 index 00000000..46eb1752 Binary files /dev/null and b/docs/uml/sequence_login.png differ diff --git a/docs/uml/sequence_login.puml b/docs/uml/sequence_login.puml new file mode 100644 index 00000000..c7d0b9ac --- /dev/null +++ b/docs/uml/sequence_login.puml @@ -0,0 +1,12 @@ +@startuml +actor User +participant "Login Page" as LP +participant "Auth Controller" as AC +participant "Database" as DB + +User -> LP: Input username & password +LP -> AC: Submit login() +AC -> DB: Check credentials +DB --> AC: Valid / Invalid +AC --> LP: Redirect or show error +@enduml diff --git a/evaluasi/blackbox/README.md b/evaluasi/blackbox/README.md new file mode 100644 index 00000000..a6467849 --- /dev/null +++ b/evaluasi/blackbox/README.md @@ -0,0 +1,29 @@ +# Laporan Black-Box Testing + +## 1. Tujuan +Melakukan pengujian black-box pada aplikasi Flask sederhana dengan skenario login, menambahkan data, dan logout menggunakan Selenium IDE. + +## 2. Skenario Pengujian +- Buka halaman utama +- Klik tombol login +- Masukkan username dan password +- Klik tombol "Tambah Data" +- Logout + +## 3. Alat yang Digunakan +- **Selenium IDE** +- **Browser** (Chrome / Firefox) +- **GitHub Codespaces (untuk hosting app)** + +## 4. Hasil Uji +File pengujian disimpan dalam file `test.side`. + +### Bukti Screenshot: +(Sisipkan file screenshot jika ada, atau catat pass/fail) + +- ✅ Login berhasil +- ✅ Tambah data berhasil +- ✅ Logout berhasil + +## 5. Kesimpulan +Semua fitur utama yang diuji berjalan dengan baik. Tidak ditemukan bug pada skenario yang diuji. diff --git a/evaluasi/blackbox/silenium test.side b/evaluasi/blackbox/silenium test.side new file mode 100644 index 00000000..a27bc83f --- /dev/null +++ b/evaluasi/blackbox/silenium test.side @@ -0,0 +1,174 @@ +{ + "id": "4b8019c9-4ecf-4fe8-bfe6-39cfd438e0ff", + "version": "2.0", + "name": "flask-test", + "url": "https://opulent-space-palm-tree-wr4459g9qj7v3gp94-8080.app.github.dev", + "tests": [{ + "id": "eec55dc4-17a1-4126-b128-7d6f0ff004f2", + "name": "Untitled", + "commands": [{ + "id": "c253cbe7-e633-4172-8935-1a5f34553b77", + "comment": "",ls evaluasi/blackbox/ + "command": "open", + "target": "/", + "targets": [], + "value": "" + }, { + "id": "fe2a07ae-075c-4113-bf6a-608b3ae22a21", + "comment": "", + "command": "setWindowSize", + "target": "1295x735", + "targets": [], + "value": "" + }, { + "id": "6eff7681-4b2f-43d1-90bb-52d0578dcad6", + "comment": "", + "command": "click", + "target": "css=.btn-primary", + "targets": [ + ["css=.btn-primary", "css:finder"], + ["xpath=//button[@type='submit']", "xpath:attributes"], + ["xpath=//button", "xpath:position"], + ["xpath=//button[contains(.,'Continue')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "61b7cc8f-a512-4e84-bc80-6ab7d0e94979", + "comment": "", + "command": "click", + "target": "css=html", + "targets": [ + ["css=html", "css:finder"], + ["xpath=//html", "xpath:position"], + ["xpath=//html[contains(.,'selamat datang di akun milik iqbal yusanta a710230023')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "3a493674-bf9e-42f2-a6e0-e30ee6e4fcd8", + "comment": "", + "command": "close", + "target": "", + "targets": [], + "value": "" + }, { + "id": "14de127d-c9d8-4f8c-944f-4dd4d6cef3f0", + "comment": "", + "command": "close", + "target": "", + "targets": [], + "value": "" + }, { + "id": "43bc8836-5eea-45fa-a879-08b4d23b7a8f", + "comment": "", + "command": "click", + "target": "css=html", + "targets": [ + ["css=html", "css:finder"], + ["xpath=//html", "xpath:position"] + ], + "value": "" + }, { + "id": "90789e9f-28d4-4906-97ef-a3b5304cbee3", + "comment": "", + "command": "click", + "target": "linkText=Ke Halaman About", + "targets": [ + ["linkText=Ke Halaman About", "linkText"], + ["css=.button", "css:finder"], + ["xpath=//a[contains(text(),'Ke Halaman About')]", "xpath:link"], + ["xpath=//a[contains(@href, '/about')]", "xpath:href"], + ["xpath=//a", "xpath:position"], + ["xpath=//a[contains(.,'Ke Halaman About')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "1bdc3c01-9c90-4f02-bdaf-b0d0a7d690a4", + "comment": "", + "command": "click", + "target": "css=body", + "targets": [ + ["css=body", "css:finder"], + ["xpath=//body", "xpath:position"] + ], + "value": "" + }, { + "id": "fa942c46-85c2-4af0-bd8b-4c13c06311fd", + "comment": "", + "command": "click", + "target": "css=body", + "targets": [ + ["css=body", "css:finder"], + ["xpath=//body", "xpath:position"] + ], + "value": "" + }, { + "id": "39817591-958f-4a9d-aa01-b15201630417", + "comment": "", + "command": "click", + "target": "linkText=Ke Halaman About", + "targets": [ + ["linkText=Ke Halaman About", "linkText"], + ["css=.button", "css:finder"], + ["xpath=//a[contains(text(),'Ke Halaman About')]", "xpath:link"], + ["xpath=//a[contains(@href, '/about')]", "xpath:href"], + ["xpath=//a", "xpath:position"], + ["xpath=//a[contains(.,'Ke Halaman About')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "845ae73f-f855-473a-8b26-40a5460dd195", + "comment": "", + "command": "click", + "target": "css=body", + "targets": [ + ["css=body", "css:finder"], + ["xpath=//body", "xpath:position"] + ], + "value": "" + }, { + "id": "fb81d979-5283-4104-9363-fc592791291f", + "comment": "", + "command": "click", + "target": "css=html", + "targets": [ + ["css=html", "css:finder"], + ["xpath=//html", "xpath:position"] + ], + "value": "" + }, { + "id": "93de2420-fd65-415d-8eba-3bb56227d45a", + "comment": "", + "command": "click", + "target": "css=html", + "targets": [ + ["css=html", "css:finder"], + ["xpath=//html", "xpath:position"] + ], + "value": "" + }, { + "id": "144a06b2-96d7-44db-9eef-959b3b052012", + "comment": "", + "command": "click", + "target": "linkText=⬅️ Kembali ke Beranda", + "targets": [ + ["linkText=⬅️ Kembali ke Beranda", "linkText"], + ["css=a", "css:finder"], + ["xpath=//a[contains(text(),'⬅️ Kembali ke Beranda')]", "xpath:link"], + ["xpath=//a[contains(@href, '/')]", "xpath:href"], + ["xpath=//a", "xpath:position"], + ["xpath=//a[contains(.,'⬅️ Kembali ke Beranda')]", "xpath:innerText"] + ], + "value": "" + }] + }], + "suites": [{ + "id": "b95dbb8f-d4eb-44d3-95f5-3928c7fb231a", + "name": "Default Suite", + "persistSession": false, + "parallel": false, + "timeout": 300, + "tests": ["eec55dc4-17a1-4126-b128-7d6f0ff004f2"] + }], + "urls": ["https://opulent-space-palm-tree-wr4459g9qj7v3gp94-8080.app.github.dev/"], + "plugins": [] +} \ No newline at end of file diff --git a/evaluasi/blackbox/test.side b/evaluasi/blackbox/test.side new file mode 100644 index 00000000..47a4ca08 --- /dev/null +++ b/evaluasi/blackbox/test.side @@ -0,0 +1,174 @@ +{ + "id": "4b8019c9-4ecf-4fe8-bfe6-39cfd438e0ff", + "version": "2.0", + "name": "flask-test", + "url": "https://opulent-space-palm-tree-wr4459g9qj7v3gp94-8080.app.github.dev", + "tests": [{ + "id": "eec55dc4-17a1-4126-b128-7d6f0ff004f2", + "name": "Untitled", + "commands": [{ + "id": "c253cbe7-e633-4172-8935-1a5f34553b77", + "comment": "", + "command": "open", + "target": "/", + "targets": [], + "value": "" + }, { + "id": "fe2a07ae-075c-4113-bf6a-608b3ae22a21", + "comment": "", + "command": "setWindowSize", + "target": "1295x735", + "targets": [], + "value": "" + }, { + "id": "6eff7681-4b2f-43d1-90bb-52d0578dcad6", + "comment": "", + "command": "click", + "target": "css=.btn-primary", + "targets": [ + ["css=.btn-primary", "css:finder"], + ["xpath=//button[@type='submit']", "xpath:attributes"], + ["xpath=//button", "xpath:position"], + ["xpath=//button[contains(.,'Continue')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "61b7cc8f-a512-4e84-bc80-6ab7d0e94979", + "comment": "", + "command": "click", + "target": "css=html", + "targets": [ + ["css=html", "css:finder"], + ["xpath=//html", "xpath:position"], + ["xpath=//html[contains(.,'selamat datang di akun milik iqbal yusanta a710230023')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "3a493674-bf9e-42f2-a6e0-e30ee6e4fcd8", + "comment": "", + "command": "close", + "target": "", + "targets": [], + "value": "" + }, { + "id": "14de127d-c9d8-4f8c-944f-4dd4d6cef3f0", + "comment": "", + "command": "close", + "target": "", + "targets": [], + "value": "" + }, { + "id": "43bc8836-5eea-45fa-a879-08b4d23b7a8f", + "comment": "", + "command": "click", + "target": "css=html", + "targets": [ + ["css=html", "css:finder"], + ["xpath=//html", "xpath:position"] + ], + "value": "" + }, { + "id": "90789e9f-28d4-4906-97ef-a3b5304cbee3", + "comment": "", + "command": "click", + "target": "linkText=Ke Halaman About", + "targets": [ + ["linkText=Ke Halaman About", "linkText"], + ["css=.button", "css:finder"], + ["xpath=//a[contains(text(),'Ke Halaman About')]", "xpath:link"], + ["xpath=//a[contains(@href, '/about')]", "xpath:href"], + ["xpath=//a", "xpath:position"], + ["xpath=//a[contains(.,'Ke Halaman About')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "1bdc3c01-9c90-4f02-bdaf-b0d0a7d690a4", + "comment": "", + "command": "click", + "target": "css=body", + "targets": [ + ["css=body", "css:finder"], + ["xpath=//body", "xpath:position"] + ], + "value": "" + }, { + "id": "fa942c46-85c2-4af0-bd8b-4c13c06311fd", + "comment": "", + "command": "click", + "target": "css=body", + "targets": [ + ["css=body", "css:finder"], + ["xpath=//body", "xpath:position"] + ], + "value": "" + }, { + "id": "39817591-958f-4a9d-aa01-b15201630417", + "comment": "", + "command": "click", + "target": "linkText=Ke Halaman About", + "targets": [ + ["linkText=Ke Halaman About", "linkText"], + ["css=.button", "css:finder"], + ["xpath=//a[contains(text(),'Ke Halaman About')]", "xpath:link"], + ["xpath=//a[contains(@href, '/about')]", "xpath:href"], + ["xpath=//a", "xpath:position"], + ["xpath=//a[contains(.,'Ke Halaman About')]", "xpath:innerText"] + ], + "value": "" + }, { + "id": "845ae73f-f855-473a-8b26-40a5460dd195", + "comment": "", + "command": "click", + "target": "css=body", + "targets": [ + ["css=body", "css:finder"], + ["xpath=//body", "xpath:position"] + ], + "value": "" + }, { + "id": "fb81d979-5283-4104-9363-fc592791291f", + "comment": "", + "command": "click", + "target": "css=html", + "targets": [ + ["css=html", "css:finder"], + ["xpath=//html", "xpath:position"] + ], + "value": "" + }, { + "id": "93de2420-fd65-415d-8eba-3bb56227d45a", + "comment": "", + "command": "click", + "target": "css=html", + "targets": [ + ["css=html", "css:finder"], + ["xpath=//html", "xpath:position"] + ], + "value": "" + }, { + "id": "144a06b2-96d7-44db-9eef-959b3b052012", + "comment": "", + "command": "click", + "target": "linkText=⬅️ Kembali ke Beranda", + "targets": [ + ["linkText=⬅️ Kembali ke Beranda", "linkText"], + ["css=a", "css:finder"], + ["xpath=//a[contains(text(),'⬅️ Kembali ke Beranda')]", "xpath:link"], + ["xpath=//a[contains(@href, '/')]", "xpath:href"], + ["xpath=//a", "xpath:position"], + ["xpath=//a[contains(.,'⬅️ Kembali ke Beranda')]", "xpath:innerText"] + ], + "value": "" + }] + }], + "suites": [{ + "id": "b95dbb8f-d4eb-44d3-95f5-3928c7fb231a", + "name": "Default Suite", + "persistSession": false, + "parallel": false, + "timeout": 300, + "tests": ["eec55dc4-17a1-4126-b128-7d6f0ff004f2"] + }], + "urls": ["https://opulent-space-palm-tree-wr4459g9qj7v3gp94-8080.app.github.dev/"], + "plugins": [] +} \ No newline at end of file diff --git a/evaluasi/etika-lisensi.md b/evaluasi/etika-lisensi.md new file mode 100644 index 00000000..3dc19fe2 --- /dev/null +++ b/evaluasi/etika-lisensi.md @@ -0,0 +1,9 @@ +# Evaluasi Etika & Lisensi + +Proyek asli menggunakan lisensi **MIT** dengan hak cipta atas nama Mumshad Mannambeth. +Lisensi MIT ini sangat permisif dan memperbolehkan penggunaan, modifikasi, dan distribusi ulang dengan ketentuan menyertakan hak cipta dan izin lisensi. + +Semua perubahan yang saya lakukan (penambahan halaman `/about`, penyesuaian tampilan, dan usability study) +**tetap kompatibel dengan lisensi MIT** karena saya tidak menghilangkan atau mengubah pernyataan hak cipta dan izin lisensi asli. + +Dengan demikian, saya sudah memenuhi etika kontribusi dan penggunaan ulang sesuai dengan lisensi MIT yang berlaku pada proyek ini. diff --git a/evaluasi/sus/Nur_Muhammad_Iqbal_Yusanta_A710230023.docx b/evaluasi/sus/Nur_Muhammad_Iqbal_Yusanta_A710230023.docx new file mode 100644 index 00000000..dbce6056 --- /dev/null +++ b/evaluasi/sus/Nur_Muhammad_Iqbal_Yusanta_A710230023.docx @@ -0,0 +1,45 @@ +Hasil Usability Study (SUS) +Nama: Nur Muhammad Iqbal Yusanta +NIM: A710230023 +Jawaban Responden +Ini nih data mentah dari 5 orang yang ngisi survei. Masing-masing ngejawab 10 pertanyaan dengan skala 1 sampai 5: +A,4,2,4,2,5,2,5,1,5,2 +B,3,3,3,3,4,3,4,2,3,3 +C,5,1,4,1,5,1,4,2,5,2 +D,4,2,4,2,4,2,4,2,4,2 +E,5,1,5,2,5,2,5,1,5,2 +Cara Hitung Skor SUS (Simple Banget!) +- Kalau nomornya ganjil (1, 3, 5, 7, 9): kurangi skor dengan 1. +- Kalau genap (2, 4, 6, 8, 10): 5 dikurangin sama skornya. +- Abis itu dijumlahin semua nilainya, terus dikali 2.5. Nah, itu deh skor akhirnya. +Hitung-Hitungannya +Responden A +Ganjil: (4−1)+(4−1)+(5−1)+(5−1)+(5−1) = 18 +Genap: (5−2)+(5−2)+(5−2)+(5−1)+(5−2) = 16 +Total = 34 × 2.5 = 85 +Responden B +Ganjil: 2+2+3+3+2 = 12 +Genap: 2+2+2+3+2 = 11 +Total = 23 × 2.5 = 57.5 +Responden C +Ganjil: 4+3+4+3+4 = 18 +Genap: 4+4+3+3+3 = 17 +Total = 35 × 2.5 = 87.5 +Responden D +Ganjil: 3×5 = 15 +Genap: 3×5 = 15 +Total = 30 × 2.5 = 75 +Responden E +Ganjil: 4×5 = 20 +Genap: 4+3+3+4+3 = 17 +Total = 37 × 2.5 = 92.5 +Tabel Skor SUS +Responden Skor SUS +A 85 +B 57.5 +C 87.5 +D 75 +E 92.5 +Rata-rata 79.5 +Kesimpulan +Kalau kita ambil rata-rata, skornya 79.5. Ini udah masuk kategori “Bagus Banget” alias Excellent. Artinya, aplikasi Flask yang kita buat udah oke dan gampang dipake menurut para responden. Mantap! diff --git a/evaluasi/sus/README.md b/evaluasi/sus/README.md new file mode 100644 index 00000000..50fa31ac --- /dev/null +++ b/evaluasi/sus/README.md @@ -0,0 +1,105 @@ +Hasil Usability Study (SUS) + +Tabel Jawaban Mentah + +Berikut data dari 5 orang yang ngisi kuesioner tentang aplikasi ini. Masing-masing jawab 10 pertanyaan pakai skala 1 sampai 5: + +A,4,2,4,2,5,2,5,1,5,2 +B,3,3,3,3,4,3,4,2,3,3 +C,5,1,4,1,5,1,4,2,5,2 +D,4,2,4,2,4,2,4,2,4,2 +E,5,1,5,2,5,2,5,1,5,2 + +Cara Ngitung Skor SUS + +Setiap orang jawab 10 pertanyaan: + +Nomor ganjil (1, 3, 5, 7, 9): nilai jawaban dikurang 1 + +Nomor genap (2, 4, 6, 8, 10): nilai 5 dikurang jawaban + +Tambahin semua, terus dikali 2.5 + +Hitung-Hitungan Skor + +Responden A + +Ganjil: 3+3+4+4+4 = 18 + +Genap: 3+3+3+4+3 = 16 + +Total = 34 × 2.5 = 85 + +Responden B + +Ganjil: 2+2+3+3+2 = 12 + +Genap: 2+2+2+3+2 = 11 + +Total = 23 × 2.5 = 57.5 + +Responden C + +Ganjil: 4+3+4+3+4 = 18 + +Genap: 4+4+3+3+3 = 17 + +Total = 35 × 2.5 = 87.5 + +Responden D + +Ganjil: 3 × 5 = 15 + +Genap: 3 × 5 = 15 + +Total = 30 × 2.5 = 75 + +Responden E + +Ganjil: 4 × 5 = 20 + +Genap: 4+3+3+4+3 = 17 + +Total = 37 × 2.5 = 92.5 + +Rekap Skor SUS + +Responden + +Skor SUS + +A + +85 + +B + +57.5 + +C + +87.5 + +D + +75 + +E + +92.5 + +Rata-rata + +79.5 + +Kesimpulan Singkat + +Rata-rata nilainya 79.5, yang artinya aplikasi ini dinilai bagus banget sama pengguna. Kalau lihat dari skala SUS: + +>80.3 = Mantap banget (Excellent) + +68–80.3 = Bagus (Good) + +<68 = B aja atau Kurang + +Jadi walau belum tembus 80.3, tapi udah sangat mendekati dan masuk kategori bagus banget. Bisa dibilang aplikasi ini udah nyaman dan gampang dipakai menurut pengguna! diff --git a/evaluasi/sus/sus-data.csv b/evaluasi/sus/sus-data.csv new file mode 100644 index 00000000..e7fb63cc --- /dev/null +++ b/evaluasi/sus/sus-data.csv @@ -0,0 +1,6 @@ +responden,Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10 +A,4,2,4,2,5,2,5,1,5,2 +B,3,3,3,3,4,3,4,2,3,3 +C,5,1,4,1,5,1,4,2,5,2 +D,4,2,4,2,4,2,4,2,4,2 +E,5,1,5,2,5,2,5,1,5,2 diff --git a/plantuml.jar b/plantuml.jar new file mode 100644 index 00000000..78d177de Binary files /dev/null and b/plantuml.jar differ