Besoin d'aides pour implémentation de tests fonctionnels

Bonjour,

Depuis quelques jours je me suis lancé dans un chantier d’envergure en tentant d’intégrer un système de tests unitaires et fonctionnels sur le projet dont j’ai la gestion.

Pour ce faire, je me suis basé sur le plugin unitTester (le seul que j’ai réussi à trouver) que j’ai mit à jour pour qu’il soit fonctionnel en 4Dv17R3.

Actuellement j’arrive à faire des fonctionnalités simple grâce aux méthodes
Générer clic
Générer frappe clavier
Endormir Process

Ainsi que des méthodes avancées que j’ai créée moi-même afin de me simplifier la tâcher.

Attendre process // pour avoir un wait selon l’activité du process principal
Générer texte // pour générer des frappes clavier en boucle pour remplir un champ aisément

Mon plugin de test s’execute dans un process à part du process courant ou se déroulent ceux-ci, je simule donc des évènements entre les process.

Je me heurte à quelques difficultés et je voulais savoir si vous aviez des solutions :

1 - Je n’arrive pas à lire les variables de mon process qui sont des entités avec LIRE VARIABLE PROCESS
Je travaille beaucoup avec des formulaires qui utilisent directement des champs de la BDD et je n’ai donc pas moyen de lire le contenu de ces objets.

Actuellement je fais des enregistrement en base de données et je fais des requêtes SQL côté test pour retrouver les objets modifiés. Ce n’est pas le plus fonctionnel, même si j’obtiens de bon résultat avec cette méthode.

2 - Je n’arrive pas à générer de double clic
Certains de mes objets ont besoin d’un double clic pour être activé, hors je n’ai pas réussi à trouver comment générer un double clic via programmation.
J’ai bien essaye de faire deux Générer clic sans latence ou très peu (10/20 tick).
J’ai regardé la fonction Générer Evenement mais au final ce n’est qu’une version bas niveau pour Générer clic et Générer frappe clavier.

3 - Je n’ai pas de moyen de savoir dans quel écran je me trouve
J’ai peut-être mal cherché mais je n’ai pas trouvé de méthode permettant de trouver dans quel formulaire je me trouvais sur le process principal à partir du process de test.

Je n’attends pas forcément de réponse complète, mais possiblement des pistes ou si jamais vous avez fait ou connaissez des implémentations de tests fonctionnels des conseils.
Je dois avouer que je n’ai pas trouvé grand chose à me mettre sous la dent en documentation pour faire du test unitaire / fonctionnel sur 4D.

Je vous remercie

Je rajoute un point que me serait utile

Est-il possible d’executer certaines commandes sur un process à partir d’un autre.
Par exemple pour connaitre le numero de la page du formulaire, le nom du formulaire et autres.

: Josselin HERVIEU

Est-il possible d’executer certaines commandes sur un process à
partir d’un autre.
Par exemple pour connaitre le numero de la page du formulaire, le nom
du formulaire et autres.
C’est simple si le process ciblé est un worker, on lui envoie la méthode à exécuter avec APPELER WORKER s’il n’a pas d’interface, avec APPELER FORMULAIRE s’il en a.
Pour un process lancé avec Nouveau process, par contre, je n’ai pas d’idée “simple”.

: Josselin HERVIEU

3 - Je n’ai pas de moyen de savoir dans quel écran je me trouve
J’ai peut-être mal cherché mais je n’ai pas trouvé de méthode
permettant de trouver dans quel formulaire je me trouvais sur le
process principal à partir du process de test.
Apparemment ton application travaille dans le process principal, or, relativement à mon message précédent, le process principal https://doc.4d.com/4Dv17R3/4D/17-R3/APPELER-WORKER.301-3907149.fr.htmlest un worker> :
« Note : Le process principal, créé par 4D à l’ouverture de la base pour l’interface utilisateur et le mode application, est un process worker et peut être appelé par APPELER WORKER. Le nom de ce process pouvant varier en fonction de la langue de 4D, il est préférable de le désigner par son numéro (toujours 1) lorsque vous utilisez APPELER WORKER. »
Tu peux donc lui envoyer des appels.

Par exemple, sur quel écran (formulaire) il est :
• exemple de code pour https://forums.4d.com/Post/FR/28441238/1/28441239#28441239récupérer les numéros de fenêtres> d’un process.
• une fois le numéro de fenêtre “$win_l” connu
<code 4D>
APPELER FORMULAIRE ($win_l;“disMoiTonFormulaire”)
</code 4D>
• la méthode “disMoiTonFormulaire”
<code 4D>
//disMoiTonFormulaire -> txt
c_texte($0;$retour_t)
$retour_t:=""
$table_p:=table du formulaire courant
$form_t:=Nom du formulaire courant
si(nil($table_p))
$retour_t:=$form_t //form projet
sinon
$retour_t:=nom de la table($table_p)+";"+$form_t //form table
fin de si
$0:=$retour_t
</code 4D>

Ha, zut : comme APPELER FORMULAIRE ne permet pas de retourner un $0, il reste un petit souci à régler : récupérer la valeur de disMoiTonFormulaire. Je pense que ça peut se régler de diverses façons : variable interprocess, storage, “rétro appel” au process appelant…

Merci pour tes propositions, je vais faire des tests pour voir si tes idées peuvent fonctionner dans mon environnement (mon process principal n’est pas le 1 dans mon cas, mais le 3 qui est créé par une commande nouveau process)

: Josselin HERVIEU

(mon process principal n’est pas le 1 dans mon cas, mais le 3 qui est
créé par une commande nouveau process)
À ce compte, il faudrait regarder “ce que ça coûte” de le lancer dans un worker - probablement pas grand chose à perdre et beaucoup à gagner.

Oui il faut que je parte dans cette direction, même si je dois avouer que le manque d’exemple d’usage dans la documentation est un frein énorme à l’usage de cette fonctionnalité.

J’ai passé mon processus navigateur en worker

<code 4D>
APPELER WORKER(“Navigateur”;“Debut”)
//<>NAV_vl_Process_Principal:=Nouveau process(“Debut”;32000*12;“Navigateur”)
</code 4D>

J’ai rendu mon process de test également créé en worker

Finalement, dans une de mes méthodes lancé par le process de test j’appelle une méthode avec mon worker.

<code 4D>
APPELER WORKER(4;“Nom Formulaire Courant”)
APPELER WORKER(“Navigateur”;“Nom Formulaire Courant”)
</code 4D>

J’ai beau avoir un point d’arrêt dans la méthode Nom Formulaire Courant, je ne l’atteint jamais et je n’ai aucun résultat alors que la méthode existe bien et que mon process navigateur est bien le 4 (j’ai testé d’autres méthodes comme mettre le nom ou récupérer le num process via la méthode chercher process)

Je n’arrive pas à comprendre d’ou vient le problème. Est-ce (je ne l’espère vraiment pas) parce que je suis en v17 32 bits ?

APPELER WORKER n’est pas la bonne commande, il faut utiliser APPELER FORMULAIRE

APPELER WORKER poste un “message” (une méthode à exécuter) au worker destinataire (wd). Si wd n’a rien d’autre à faire, il relève sa boite à lettres et exécute la méthode. Mais si wd est occupé, il ne relèvera sa boite que quand il aura fini. Être occupé, pour un worker, c’est :

  • sans interface = juste du code qui tourne (mouliner les données…)
  • avec interface = une fenêtre affiche un formulaire

En l’occurrence, tant que ton worker 4 est occupé à afficher sa fenêtre-formulaire, il ne peut pas relever la boite à lettre APPELER WORKER. Ça durera jusqu’à ce que cette fenêtre se ferme, où ce sera exécuté en rafale.

Pour ces workers “avec interface”, tu as un autre système de boite aux lettres, APPELER FORMULAIRE(numéro fenêtre). C’est toujours le principe de boite à lettres, mais associée à une fenêtre, au lieu d’un worker. Il faut simplement déterminer le numéro fenêtre destinataire, d’où le lien de mon message précédent vers une méthode qui, connaissant un numéro de process (le 4, dans ton exemple), retourne le (ou les) numéro de fenêtre de ce process :

  • aucun numéro de fenêtre retourné => sans interface => APPELER WORKER
  • un numéro de fenêtre retourné => avec interface => APPELER FORMULAIRE

C’est bien plus clair comme ça, merci.