# अपने ऐप का परीक्षण करना

> परीक्षण फ्रेमवर्क (TestCase), टच का सिमुलेशन और स्क्रीनशॉट द्वारा दृश्य तुलना।

Source: https://crossfly.dev/hi/docs/learn/testing-your-app — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# 11. अपने ऐप का परीक्षण करना

> **आप क्या सीखेंगे:** ऐसे परीक्षणों के साथ एक सुरक्षा जाल बनाना जो ग्राफिकल रनटाइम में चलते हैं।
> **पूर्वापेक्षाएँ:** [रिस्पॉन्सिव बनाना](/docs/learn/making-it-responsive).

## पूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)
अन्य अध्यायों से अलग, यहाँ स्वयं-पर्याप्त उदाहरण एक पूर्ण `TestCase` है (`MainWindow` नहीं): `load()` में स्क्रीन खोलता है,
`runTests()` में टच का सिमुलेशन करता है और स्क्रीनशॉट की तुलना golden से करता है। `DeviceConfig.isTesting = true`
रेंडरिंग को निर्धारक (deterministic) बनाता है। जैसा है वैसा ही कंपाइल होता है।
```java
package com.exemplo;

import dev.crossfly.test.*;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;

public class AdicionarTarefaTest extends TestCase
{
   @Override
   protected void load() throws Exception
   {
      DeviceConfig.isTesting = true;                 // golden की पूर्व-शर्त (determinism)
      new TarefasScreen().show();
   }

   @Override
   public void runTests() throws Exception
   {
      waitWindow(TarefasScreen.class);               // एक स्थिर frame की प्रतीक्षा करता है
      type(0, TextField.class, "Comprar pão");       // पहले TextField में टाइप करता है
      click("Adicionar");                            // टेक्स्ट से button पर क्लिक करता है
      shot();                                        // golden को कैप्चर कर उससे तुलना करता है
   }

   @Override
   protected void unload() { }
}

class TarefasScreen extends Window                   // परीक्षण के अधीन स्क्रीन
{
   private final TextField campo = new TextField().caption("Nova tarefa");
   private final Component listaBox = new Component();

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());
      add(LAY_AUTO, campo);

      Button add = new Button("Adicionar");
      add.onAction(c -> {
         String t = campo.getText().trim();
         if (!t.isEmpty()) { listaBox.add(LAY_AUTO, new Label(t)); campo.clearText(); listaBox.setValidLayout(false); repaint(); }
      });
      add(LAY_AUTO, add);

      listaBox.setLayout(new VerticalLayout());
      add(LAY_FILL, listaBox);
   }
}
```
सूट को चलाने के लिए:
```java
new TestSuite().startTests(new TestCase[]{ new AdicionarTarefaTest() });
```
> नीचे दिए गए स्निपेट **केवल मुख्य भाग** दिखाते हैं (जो `onShow()` के अंदर जाता है)। चलाने के लिए, उन्हें ऊपर दिए गए `MainWindow` ढाँचे में रखें।

## परीक्षण ग्राफिकल रनटाइम में चलते हैं (यह JUnit नहीं है)
प्रत्येक `TestCase` paint thread/GL पाइपलाइन के अंदर चलता है; मुख्य अभिकथन (assertion) स्क्रीनशॉट की **दृश्य तुलना**
(*golden images*) है।
```java
public class AdicionarTarefaTest extends TestCase {
   @Override protected void load() throws Exception { new TarefasScreen().show(); }
   @Override public void runTests() throws Exception {
      waitWindow(TarefasScreen.class);
      type(0, TextField.class, "Comprar pão");   // field में टाइप करता है
      click("Adicionar");                         // button पर क्लिक करता है
      shot();                                     // golden को कैप्चर कर उससे तुलना करता है
   }
   @Override protected void unload() { }
}
```
एक `TestSuite` के साथ चलाना:
```java
new TestSuite().startTests(new TestCase[]{ new AdicionarTarefaTest() });
```

## ⚠️ निर्धारकता (Determinismo): `DeviceConfig.isTesting`
पिक्सेल-दर-पिक्सेल तुलना तभी मेल खाती है जब रेंडरिंग निर्धारक हो। `DeviceConfig.isTesting = true` चालू करें
(cursor को स्थिर करता है, timestamps हटाता है) — **इसके बिना, golden कभी मेल नहीं खाता**।
एक **स्थिर फ्रेम** कैप्चर करने के लिए `shot()` से पहले `waitWindow(...)`/`waitAnimation()` का उपयोग करें।

## सीधा स्क्रीनशॉट
```java
Image atual = Main.getScreenShot(true);   // baseline से तुलना के लिए frame (opaque) कैप्चर करता है
```

## इस चरण में आप बनाते हैं
कार्य को **जोड़ने/स्थायी बनाने** के लिए परीक्षण और एक स्क्रीन का **दृश्य परीक्षण**।

## संक्षेप में
`TestCase` (`load`/`runTests`/`unload`) + `click`/`type`/`shot`; `DeviceConfig.isTesting` golden की
पूर्वापेक्षा है; स्थिर फ्रेम कैप्चर करें।

## अगले कदम
→ [प्रकाशित करना](/docs/learn/shipping)

## यह भी देखें
- [परीक्षण (best-practices)](/docs/best-practices/testes) · कैननिकल स्रोत: अध्याय 31 — परीक्षण
