Dina Benkirane

Mandat du projet


Mon mandat pour le projet pour les 4 prochains mois sera de travailler sur l’application Android. Mis à part à devoir me familiariser avec le code présent. Je me suis entendu améliorer la maintenabilité de l’application. Possiblement adapter le code pour qu’il soit plus compréhensible, réduire la duplication de code et réduire les mauvaises pratiques en utilisant des outils de détections pour ce genre de problème. Aussi, ajouter des tests unitaires (et possiblement des tests d’intégrations) pour pouvoir s’assurer du fonctionnement de la logique du code et mettre en place une documentation pour diriger les nouveaux étudiants qui vont travailler sur le projet de continuer à faire des tests unitaires avant d'implémenter une nouvelle fonctionnalité et de la déployé. Revoir la migration de données vu qu’il y avait des problèmes concernant celle-ci. Continuer sur le développement de l’application en général soit en réglant des bogues existants ou l’implémentation de fonctionnalités demandée par Lena.

Rapport final


Cliquer ici pour voir le rapport final

Rapport hebdomadaire

Pour la première semaine c’était une semaine de préparation, on a fait la première rencontre hebdomadaire avec Lena qui nous a expliqué l’application, nos rôles et nous avons donné les accès administrateurs aux divers outils qui sont nécessaires au projet. Tel que le répertoire de github et la console de google play pour le déploiement de l’application. Ensuite, j’ai eu une discussion avec Théodore qui travaille dans le côté Android et il m’a expliqué une bonne partie du code et quelques astuces pour tester l’application sur mon téléphone et le fonctionnement général de l’application. De plus, Théodore m’a donné une petite tâche à accomplir qui consiste à mettre à jour les icônes de la barre de navigation. Cette semaine je me suis concentré à faire fonctionner Android Studio qui m’a créé un peu de trouble à faire marcher vu que ma version d’Android studio était trop ancienne pour gradle, mais tout fonctionne actuellement.

Cette semaine, j’ai tenté de faire la tâche de la mise à jour des icônes de la barre de navigation. Sans succès, j’ai demandé de l’assistance à Théodore qui a tenté de m’aider, par contre avec Android Studio ceci est un peu difficile à faire, vu qu’Android Studio enlève les couleurs des icônes qu’on veut ajouter, donc il faudra trouver une autre manière d’implémenter les icônes sans qu’elles deviennent noires.
Ensuite, j’ai discuté avec Philippe par rapport à fixer un bogue majeure sur l’application. En effet, les gens qui ont une ancienne version de l’application avec des photos sauvegardées n’arrivent plus à utiliser l’application sans qu’elle se ferme automatiquement. La base de données a changé et du coup ne concorde plus avec ce que les utilisateurs avaient de sauvegardé dans leur téléphone ce qui crée un problème. Donc, pour le moment on essaie de faire une correction rapide pour pouvoir régler le problème le plus vite possible.
Du coup, en discutant avec Lena et Philippe, j’ai pu trouver une mission pour cette session pour mon implication au sein du projet Mona. Vu que le côté backend cause beaucoup de problèmes, je dois faire une modification du code existant pour que le tout soit robuste face au changement futur. Idéalement, ce serait bien d'ajouter des tests unitaires avec des Mocks pour pouvoir simuler les retours de la base de données et permettre une bonne vérification du bon fonctionnement de l’application avant le déploiement d’une version.

Cette semaine, je n'ai pas pu faire de travail sur le projet à cause d'un déménagement donc je rattraperais le temps perdu la semaine prochaine.

Cette semaine, j’ai pu discuter à nouveau avec Philippe concernant le bogue qui est présent, par contre on n’a pas pu avancer énormément, car il y avait un autre bogue présent qui fait planter l’application concernant les badges. Cependant, j’ai mieux compris comment tester les changements qu’on a pu faire pour pouvoir le fixer rapidement! Sinon, avant de pouvoir parler à Philippe, j’ai fait des recherches par rapport à comment faire le design du back-end de l’application et faire en sorte que tout soit plus robuste. J’en ai fait la conclusion qu’un numéro de version de la base de données de l’application et du côté serveur serait pratique. Par ailleurs, je pensais faire une architecture à plusieurs niveaux, mais je ne suis pas encore certaine. D’ici la semaine prochaine, je vais tenter de pouvoir faire un schéma de ce que je planifie de faire et tester les changements pour le bogue.

La journée du samedi, j’ai voulu faire un schéma pour ma reconstruction du back-end de l’application et implémenter l’architecture que j’avais en tête. Cependant, en inspectant le code davantage, j’ai réalisé que l’application était déjà une architecture à plusieurs niveaux. Il y a la base de données, le niveau de service et un « processing layer ». Alors, j’ai décidé de simplement améliorer ce qui est déjà présent. Voici une liste brève de ce que je planifie de faire sans ordre particulier :
  • Crée des tests unitaires et des « mocks »
  • Améliorer la gestion d’erreur, ici je dois discuter peut-être de ce qui est déjà en place pour m’assurer de ce qui est présent. Peut-être ajouter un élément graphique qui avertit l’utilisateur qu’un élément ne fonctionne pas, ou bien de bloquer un aspect de l’application pour éviter les erreurs, ce qui serait mieux que l’application qui plante. Le comportement sera à définir pour différent problème soulevé.
  • Ajouter certains patrons de conception pour aider au couplage et à la cohésion des classes présentes. Certaines classes ont beaucoup de méthode ou des méthodes qui se répètent dans d’autres classes. Par exemple, les classes reliées aux endroits culturels et les œuvres d’art, ce qui serait bien d’ajouter une classe abstraite pour ce genre de situation.
  • Autres détails que j’ai remarqué qui n’est pas de bonnes pratiques à faire, ce qui sera modifié au fur et à mesure que je les remarque.
Pour la journée du dimanche, lundi et mercredi, je me suis concentré à résoudre le bogue qu’on m’a assigné au début de la session. Malheureusement, je ne sais pas quoi faire. J’ai déjà écrit la solution potentielle avec Philippe les semaines passées,donc il ne restait qu'à tester la solution. C’est ça justement le problème, c’est très difficile à reproduire les conditions du bogue.
Pour pouvoir tester le bogue il faut pouvoir avoir une ancienne version de l’application ou l’état du serveur avec les données de l’ancienne base de données ouvrir l’application et prendre une photo d’une œuvre quelconque et ensuite la mettre a jour à ce que j’ai fait et voir si l’application fonctionne et ne plante pas. Alors, j’ai essayer de « rollback » a un ancien commit qui concorde à l’ancienne version de créé ce qu’on appelle un « APK » qui est l’exécutable pour télécharger l’application directement sur le téléphone ou un émulateur. Cependant, ce n’est pas possible. Les versions et les dépendances existantes sur la vieille version sont obsolètes et ne fonctionnent plus, ce qui crée beaucoup de problèmes dans le code et même le code généré par gradle, ce qui ne peut pas être modifié à la main. Donc après plusieurs heures pour essayer de pouvoir la faire marcher j’ai abandonné et essayé une autre approche pour pouvoir reproduire le même comportement. Donc j’ai pris une version récente et j’ai tenté d’enlever les colonnes des tables qui n’existaient pas dans l’ancienne version qui pose problème. Mais il y a tellement de référence et d’utilisation de ces variables qu’après plusieurs heures je n’ai pas pu arriver à compiler le projet et le faire fonctionner sur mon téléphone. Par conséquent, je vais essayer de demander conseil, vu que je n’ai vraiment aucune idée de ce que je peux faire. D'ailleurs je vais garder les « APK » des versions du google Play store pour que les futurs étudiants ne rencontrent pas le même problème que moi.

Cette semaine, j’ai tenté de donner mon centre d’attention sur le correctif du bogue. En fin de compte, j’ai réussi à le régler. En revanche, j’ai perdu beaucoup de temps. Premièrement, j’ai découvert que je n’arrivais pas à prendre de photo sur mon téléphone avec l’application, ce qui semblait être un problème unique à mon téléphone vu que Théodore et Léna et une autre marque de téléphone que j’avais en main semblent ne pas avoir ce problème. Donc, Théodore a tenté de voir le problème de son côté, mais finalement son correctif n’a pas réussi pour moi. Alors, j’ai essayé de voir si je pouvais le régler, mais je n’ai pas pu. À la place, je n’ai pas voulu perdre trop de temps avec ceci et j’ai simplement utilisé un autre téléphone, après du temps pour comprendre comment bien tester le correctif avec 2 colonnes bidon, j’ai vu que l’application ne plante pas. Du coup, j’assume que le correctif marche avec les colonnes actuelles, mais seulement avec un numéro de version différente.
Enfin, je vais pouvoir passer à autre chose. En regardant encore le code, j’ai observé beaucoup de duplication de code. J’ai commencé à faire du « refactoring » sur une autre branche. La semaine prochaine je vais tenter de commencer les tests unitaires et mettre à jour mon mandat sur cette page web.
Note - On a déplacé nos rencontres hebdomadaires avec Léna au lundi donc je mettrais à jour le rapport le lundi.

Cette semaine, j'ai voulu mettre le correctif en test interne sur le Google play, j'ai passé du temps à essayer de pousser mes changements, car je n'y arrivais pas. Après un certain temps j'ai demandé à Théodore et Lena pour savoir si c'était bien moi qui n'y arrive pas ou si j'ai besoin d'une clé spécifique, j'ai vérifié en ligne pour des réponses, mais au final j'ai conclu qu'il y a une chance que ce soit différent pour notre situation. Donc, pour le moment j'attends une réponse en espérant que je puisse le mettre en test interne la semaine prochaine pour que les testeurs internes regardent s'il n'y a pas de problème.

Entre temps, j'ai commencé à travailler sur mon mandat de manière concrète, j'ai implémenté les tests unitaires pour une classe pour le moment vu que je devais me familiariser avec les tests unitaires sur Kotlin, j'ai ajouté des «plug-ins» de mon côté pour repérer les «code smells» et bogues potentiels (Sonarlint, Spotbug) et j'ai fait un peu de «refactoring». Je n'ai pas fini pour le moment, mais c'est un début. J'ai pensé a ajouter JaCoCo pour voir la couvrance des tests unitaires, par contre pour le moment je ne pense pas que ce soit très nécessaire pour le moment d'ici la fin du projet je vais voir ou j'en suis. Références:
https://kotlinlang.org/docs/jvm-test-using-junit.html#what-s-next
https://phauer.com/2018/best-practices-unit-testing-kotlin
https://phauer.com/2019/modern-best-practices-testing-java/#use-junit5
https://junit.org/junit5/

Cette semaine, j'ai fait des tests unitaires pour le module de converter. Ce qui m'a pris du temps vu qu'il fallait que j'apprenne les bonnes façons de faire, j'ai dû ajuster les tests par la suite. Par contre, vu que c'était le module le plus facile j'ai pu complété les tests sur le module. J'ai mis à jour certaines dépendances dans les builds gradle, par contre certaines ne sont pas possibles à mettre à jour. J'ai aussi pu mettre le correctif en test interne, par contre Lena ne possède plus l'ancienne version de l'application ce qui fait en sorte qu'on ne pourra pas tester le correctif de manière sûre. Cependant, je vais demander aux gens de Mona s'il y a quelqu'un qui va pouvoir le faire dans les tests interne.
Note: j'ai repris certaines heures de retard.

Cette semaine il n'y a pas eu un grand avancement. Je suis en train de tester le module concernant les bases de données vu que c'est um module que j'ai travaillé auparavant, du coup j'ai pensé qu'il serait plus facile a apprendre que le reste. Le code lié à ça mais j'essaie de faire des tests d'intégration à la place de faire des test unitaires avec un mock. Par contre, j'ai eu un peu de difficulté à comprendre comment faire ce qui m'a assez ralenti. Aussi, c'est un module un peu plus complexe que celui des converter donc c'est normal. Je vais tenter de le compléter d'ici cette semaine. Note: j'ai repris certaines heures de retard.

Cette semaine, j'ai avancé sur les tests unitaires du du module database, par contre j'ai fait environ 6h de travail, aussi j'ai eu un peu de misère avec les tests d'intégration ce qui ma un peu ralenti. J'ai tenté de faire marcher sonarqube qui est un outil plus puissant que sonarlint et spotbug pour repéré les code smells et les bugs potentiels. Cependant, j'ai eu de la misère à le faire marcher. Ce qui ma laissé avec quelques problèmes de compilation.

En, début de semaine j’ai fait une nouvelle version sur google play avec les correctifs pour la migration et ceux de Théodore pour le thème sombre. En même temps, j’ai créé un dossier pour avoir des apk pour les versions sur google play pour aider à tester en cas de besoin futur.
Ensuite, j’ai profité pour mettre à jour certaines dépendances sur gradle, mais certaines dépendances n’ont pas été mis à jour dû au fait que la mise à jour de ceux-ci cause des plantages.
Après, j’ai tenté de réglé le problème de la caméra qui ne se lance pas sur mon téléphone pendant plusieurs heures, sans succès j’ai poussé ce que j’ai entamé sur une branche pour ensuite travailler sur ce sujet durant un autre moment.
Un autre point que j’ai aussi regardé et l’envoie des commentaires et notes sur les œuvres prises en photo, comme abordé lors de la rencontre hebdomadaire en attendant le correctif des photos qui ne s’envoient pas on a voulu au moins envoyer les commentaires et note attribués à ces œuvres. Par contre, en regardant ce problème j’ai remarqué dans la base de données qu’une autre photo s’envoie à la place de ma photo ce qui me semble étrange.

Ceci n’est pas ma photo.
Finalement, j’ai continué à travailler sur les tests unitaires, j’ai tenté de faire le module d’activity vu qu’il me semblait assez simple, mais finalement après certaines recherches j’ai remarqué que ce n’était pas utile vu que la méthode comprise dans la classe n’est pas facilement testable. Du coup, j’ai essayé de voir plus de documentations pour pouvoir mieux comprendre ce qui doit être testé.
Références sur test unitaires :
https://developer.android.com/training/testing/fundamentals
https://developer.android.com/studio/test#view_test_coverage
https://www.vogella.com/tutorials/AndroidTesting/article.html
https://proandroiddev.com/understanding-unit-tests-for-android-in-2021-71984f370240
https://proandroiddev.com/easy-instrumented-tests-ui-tests-for-android-in-2021-2e28134ff309
Finalement j’ai fait de l’avancement sur les tests unitaires du module de database, j’ai fait du refactoring sur quelques parties de code dans activity pour réduire la complexité de la fonction onCreate dans toutes les classes activity au besoin.

Cette semaine, j'ai entamé la documentation qui ne devrait pas être trop complexe, mais qui doit quand même être faite. J'ai fait la transformation des tests unitaires de database en tests instrumentale , ce qui m’a pris du temps, mais au final c'est mieux que des tests unitaires vu que ça teste mieux les classes en question à mon opinion. Finalement j'ai fait 1 test UI, que je compte dupliquer et accommodé

Dernière semaine pour les rapports hebdomadaires voici ce qui a été fait :
  • j’ai finalisé la documentation pour les conseils de développement, je dois seulement le publié sur github, avec aussi l’ajout de APK pour aider au débogage.
  • J’ai ajusté la page de l’œuvre du jour, l’image de base n’est plus floutée, les icônes sont bien alignées au centre et la partie blanche ne chevauche plus la partie mauve.
  • J’ai fait une dernière tentative pour séparer les lieux et les œuvres, mais c’était trop complexe pour le temps qui me reste.
  • J’ai fait la migration d’Android support à androidX vu que Android support n’est plus supporté en septembre, d’ailleurs on avait déjà pas mal de dépendance d’androidX déjà présente.
  • Finalement, j’ai fait des tests unitaires sur les autres dossiers ou il m’était possible d’en faire pour pouvoir laisser un exemple pour les prochains développeurs.
  • Conversion de package utilisé pour le PreferenceManager, il créé un problème de crash occasionnel avec des erreurs dans la console.
  • Encore du refactoring, mais cette fois-ci c'est finalisé pour l'ensemble du projet.
  • L'envoi de photo est opérationnel vers le serveur maintenant!
Je vais donc me concentrer sur le rapport final et la préparation à la présentation orale.

Voici une liste des choses accomplies durant le projet
  • Apprentissage de Kotlin
  • Apprentissage du développement Android
  • Familiarisation avec le code
  • Envoie d'une requête POST pour l'envoie de photo aux serveurs
  • Création d'une documentation
  • Déploiement d'une version sur Google play utilisant le Google play console.
  • Correction d'une anomalie UI
  • Mise à jour des dépendances
  • Correctif d'une bogue qui causait à l'application de planter
  • Ajout de tests unitaires
  • Ajout de tests instrumentaux
  • Réusinage sur l'ensemble de l'application en utilisant des plug-ins