إثبات التغطية
ما الذي يجب أن يصحّ قبل أن تسمّي Vera اختبارًا تغطية.
توليد اختبار سهل، ويزداد سهولة كل شهر. أما معرفة إن كان ما ولّدته يثبت شيئًا فهي الجزء الذي لا يأتي مجانًا مع نموذج أفضل. هذه كل فحوص Vera، وكل ما ترفض احتسابه.
رسم توضيحي لا قياس. العروض تُظهر أن كل بوّابة تزيل شيئًا وتسمّيه — وصفحة تحاجج ضد الأرقام المخترَعة لا يحقّ لها أن تتزيّن بأي منها.
يُكتَب مقابل صفحتك الحقيقية
قبل أن تُولَّد كلمة، تُحمِّل Vera الصفحة وتربط كل عنصر تفاعلي بمحدِّد تحقّقت من أنه فريد — مفضِّلة معرّفات الاختبار والسمات على النص الذي قد يُحَلّ إلى عقدة ابنة. ويكتب النموذج مقابل هذه الخريطة، فلا يستطيع الحكم على زر غير موجود، ثم يُثبِت التشغيل التالي كل سيناريو في متصفح حيّ بدل الوثوق بالمخرَج.
الاختبارات الفارغة لا تصلك
على السيناريو أن يفعل شيئًا ثم يدّعي شيئًا. وأي سيناريو بلا تفاعل حقيقي، أو بلا حكم، أو بخطوة محدِّدها فارغ، يُعلَّم قبل أن يُعرَض عليك أصلًا — لأن «يفتح الصفحة ويرى الشعار» ينجح على أي صفحة تقريبًا، بما فيها صفحة فعل فيها التطبيق الشيء الخطأ.
الضبط السالب: لا بدّ أن يكون قادرًا على الفشل
الفحص الذي يجيب عن السؤال فعلًا. تُعيد Vera تشغيل الاختبار وهي تطالب بنتيجة لا يستطيع تطبيقك إنتاجها — فجدول البيانات يُقلَب عمود القبول/الرفض فيه، وأي اختبار آخر تُزيَّف القيمة المتوقَّعة في أحد أحكامه. وكل واحد من هذه الضوابط يجب أن يفشل. فإن نجح الاختبار رغم ذلك، فأحكامه ليست موصولة بتطبيقك أصلًا، وتسجّل Vera الحكم غير حسّاس على الاختبار.
ولا يُمَسّ إلا التوقّع أبدًا — لا المُحدِّد. فالضبط الذي يفشل إنما يفشل لأن التطبيق خالفه، لا لأن الاختبار لم يعد يجد الزرّ. ويبقى إجراءً صريحًا لا خطوة تلقائية بعد التوليد، لأن كل ضبط تشغيل حقيقي في متصفح، ومضاعفة كلفة توليد مجموعة ثلاث مرات بصمت مفاجأة أسوأ من زرّ.
تغطية لا تجاملك
تشتقّ خريطة التغطية حالتها لحظة القراءة من الاختبارات التي تُصرِّح بكل قاعدة، فلا تتقادم. ولا تكون القاعدة مغطّاة إلا حين يعمل عليها اختبار مُثبَت الحساسية. أما القاعدة التي كل اختباراتها غير حسّاسة فليست مغطّاة ولا جزئية ولا تُذوَّب في متوسّط — بل لها خانتها الخاصة، مرتّبة دون غير المغطّاة، لأن غير المغطّاة تبدو على الأقل عملًا مؤجّلًا.
من أين تأتي التوقّعات
الصفحة لا تخبرك إلا بما هو معروض عليها، ولا تستطيع أبدًا أن تخبرك بما يُفترض أن يكون معروضًا — ولذلك لا تحاول Vera استنتاجه. لكل مشروع دفتر قواعد يصف ما يجب أن يفعله التطبيق، وكل قاعدة تحمل المصدر الذي قُرئت منه. والتوليد يقرأ القواعد المعتمَدة ولا شيء سواها، فلا تستطيع قاعدة لم يقبلها أحد أن تُعرِّف تغطيتك بهدوء.
الذكاء الاصطناعي يقترح · والإنسان يعتمد · ولا يُولَّد إلا مقابل القواعد المعتمَدةليست كل الأدلّة سواء
هذا هو المأزق، بصراحة، لأنه السؤال الذي يطرحه أي مهندس متيقّظ على الفكرة كلها. افترض أن المتطلَّب كان «عملاء بريميوم يحصلون على خصم 20%» بينما شُحنت الشيفرة بـ 10%. القاعدة المقروءة من تلك الشيفرة ستقول 10%. والاختبار المولَّد منها سيؤكّد 10%. ثم يقلب الضبط السالب التوقّع، فيفشل الاختبار كما ينبغي، وتصنّف Vera التأكيد حسّاسًا — بشكل صحيح، وبلا فائدة. الحساسية ليست صحّة. إنها تثبت أن الاختبار موصول بتطبيقك، لا أن التوقّع كان صائبًا.
ولهذا يسجّل دفتر القواعد مصدر كل قاعدة ويعرضه عليها. القاعدة المقروءة من تنفيذك توافق تنفيذك بحكم التكوين — وهذا كل ما تستطيعه. أما القاعدة المنقولة عن شيء كُتب قبل الشيفرة، بيد إنسان، فهي الوحيدة القادرة على مخالفة تطبيق يعمل. لذلك تقرأ Vera معايير القبول مباشرة من تذكرتك في Jira أو Linear أو GitHub — حتميًا، ناقلةً كلمات كاتبها لا معيدةً صياغتها — وتضع على كل قاعدة مصدرها، ليكون اعتمادها قرارًا تُتَّخذ حقيقته أمام عينيك.
وقواعد الصلاحيات تُحاسَب بالمعيار نفسه
قاعدة الصلاحية تُغيّر الفاعل لا المُدخَل، فتُفحَص بتشغيل الاختبار نفسه مرة لكل دور مع توقّع لكل دور. والفخّ هو احتساب خانة «يجب أن يُمنَع هذا الدور» محقّقةً كلما فشل التشغيل — فانتهاء مهلة محدِّد أو عطل شبكة أو خطأ مطبعي كلها ستُقرَأ «مُنِع بشكل صحيح». لذا لا بدّ أن يكون الرفض مرصودًا: رمز 401 أو 403 أو رسالة رفض يسمّيها مشروعك بنفسه. وما عدا ذلك غير حاسم، وهي نتيجة ثالثة عن قصد — لا نجاح يُحتفَل به ولا فشل يُصلَح، بل نتيجة تحتاج إنسانًا.
ما لا تسمّيه Vera تغطية
الخانات الأربع التي تُبلِغ عنها اللوحة. وغير الحسّاس يُرتَّب دون غير المغطّى عن قصد: القاعدة غير المغطّاة تبدو على الأقل عملًا مؤجّلًا، أما القاعدة التي يغطّيها اختبار لا يستطيع الفشل فتبدو منجَزة. والعروض توضّح الخانات لا مشروعًا مقيسًا.
الأخضر ليس شيئًا واحدًا
المجموعة التي تقول «كلها ناجحة» تخبرك بأقلّ ممّا يبدو. فقد ينجح الاختبار لأن تطبيقك سليم، أو لأنه فشل ثم أنقذته إعادة محاولة، أو لأن مُحدِّدًا تقادَم فأعاد الإصلاح الذاتي كتابته أثناء التشغيل. هذه ثلاث حقائق مختلفة عن إصدارك، ودمجها في علامة خضراء واحدة هو الطريق إلى خط أنابيب لا يعني شيئًا.
الإصلاح الذاتي لا يعيد كتابة إلا المُحدِّد، ولا يمسّ التوقّع أبدًا — فالتأكيد ظلّ لازمًا أن يصمد أمام تطبيقك، ولهذا فالنجاح بعد إصلاح ليس فشلًا. لكنه قد يخفي تغيّرًا دلاليًا: إذا اختفى زر حذف العميل وربط المُصلِح الخطوة بعنصر مجاور، فقد ينجح تأكيد عام بينما يكون التفاعل الذي كُتب الاختبار من أجله قد زال. لذلك تُبلِّغ Vera عنه على حدة، وتذكر المُحدِّد قبل الإصلاح وبعده، وتتيح لك جعله بوّابة — وعادةً تُفشِل الفرقُ التشغيلَ المُصلَح على فرع الإصدار وتكتفي بالتحذير على فروع الميزات.
fail-on-flaky · fail-on-healed
أجوبة مباشرة
الأسئلة التي كنت ستسألها على أي حال.
مكتوبة كما تُطرَح فعلًا، لا كما نتمنّى أن تُطرَح. والأجوبة هي الآلية نفسها لا الدعاية — وخمسة منها تعترف بحدٍّ حقيقي، لأن القارئ الذي يكتشف الحدّ بنفسه يكفّ عن تصديق البقية.
لماذا لا أستخدم نموذجًا مباشرة
صار Claude يقود متصفحًا. فلماذا أحتاجكم أصلًا؟
لمعاينة صفحة، لا تحتاجنا — فوكيل معه متصفح أفضل في ذلك فعلًا وأرخص. استخدمه.
لكن تلك الجلسة ليست بوّابة. هي عابرة، وغير مُصادَقة ما لم تقده إلى تسجيل الدخول في كل مرة، ولا تترك سجلًّا. ولا أحد يوجّهه الثانية فجرًا حين يصل دمج سيّئ. أما Vera فتشغّل التدفقات نفسها ببيانات دخول، وبدور محدَّد، وعلى بيئة محدَّدة، وفق جدول وداخل التكامل المستمر — وتحتفظ بالنتيجة، فيبقى شيء تقارن به الأسبوع القادم.
وهي ليست إمّا/أو. تأتي Vera بخادم MCP، فتستطيع أن تطلب من Claude تشغيل مجموعة الدفع على staging وقراءة العطل وفتح المشكلة — لكنه يفعلها عبر الشيء الذي يحفظ السجلّ.
ألا يمكنني ببساطة أن أطلب من وكيل برمجي كتابة اختبارات Playwright؟
تستطيع اليوم، وسيسلّمك شيئًا معقولًا. ثم تتولّى أنت الجزء الصعب فعلًا: تشغيله مع كل طلب دمج بالمستخدم الصحيح، وعلى البيئة الصحيحة، في متصفحات حقيقية، ببيانات دخول تعمل؛ وإبقاءه ناجحًا حين يتغيّر DOM في الدورة القادمة؛ ومعرفة ما إذا كان أيٌّ من ذلك يثبت شيئًا.
كتابة المسودة الأولى أرخص خطوة في العمل كله. وVera هي بقيّته.
هذه مجرد غلاف حول نموذج.
ميزة التوليد غلاف فعلًا، عن قصد ورقيق، لتستطيع تبديل النموذج يوم يصدر أفضل منه. ونحن نفضّل أن نكون غلافًا رقيقًا على أن نكون توجيهًا متقادمًا.
أما البقية فليست كذلك. أوقِف الذكاء الاصطناعي كليًا وستظل Vera تسجّل التدفقات، وتشغّلها على ثلاثة محرّكات متصفح، وتدير مجمّع متصفحات، وتختم بيانات الدخول، وتحفظ الفيديو والتتبّعات، وتقارن اللقطات بالمرجعيات، وتعمل وفق جدول، وتحرس طلبات الدمج، وتصدّر إلى كود. النموذج يكتب مسودات أولى، ولا يفعل شيئًا من ذلك.
ألن يكون النموذج القادم جيدًا بما يكفي ليجعل ضماناتكم بلا معنى؟
النموذج الأفضل يجعل الاختبار المُولَّد خاطئًا مرات أقل. لكنه لا يخبرك إن كان هذا الاختبار خاطئًا — وهذا سؤال من نوع آخر، لا تحلّه جودة النموذج مهما بلغت، لأن تصحيح النموذج لمخرَجه هو المشكلة لا الحل.
والضبط السالب تجربة لا توجيه: شغّل الاختبار على بيانات يجب أن يرفضها وانظر هل يفشل. هذا الفحص يزداد رخصًا كلما تحسّنت النماذج، ولا يصبح زائدًا أبدًا. بل كلما تحسّن التوليد زاد عدد اختباراتك وقلّ ما يقرؤه إنسان منها.
لماذا أثق بما تولّده
كيف تعرف أن اختبارًا مُولَّدًا يغطّي حالة الاستخدام، لا مجرد الصفحة؟
لأن حالات الاستخدام مكتوبة. تحتفظ Vera بدفتر قواعد لكل مشروع يصف ما يُفترض أن يفعله تطبيقك — كل قاعدة مقترحة من الشيفرة المصدرية مع دليل بالملف والسطر، ولا يعتمدها إلا إنسان. ثم تُقاس التغطية مقابل تلك القواعد، لا مقابل عدد الاختبارات التي وُلّدت.
والفارق جوهري: الصفحة لا تخبرك إلا بما هو معروض عليها، ولا تستطيع أبدًا أن تخبرك بما يُفترض أن يكون معروضًا. هذا ما لا تحلّه قراءة DOM مهما بلغت، ولهذا يُعتمد دفتر القواعد بشرًا لا استنتاجًا.
ما الذي يمنع اختبارًا مُولَّدًا من النجاح دون أن يختبر شيئًا؟
الضبط السالب. تُعيد Vera تشغيل الاختبار وهي تطالب بنتيجة لا يستطيع تطبيقك إنتاجها — فجدول البيانات يُقلَب عمود القبول/الرفض فيه، وأي اختبار آخر تُزيَّف القيمة المتوقَّعة في أحد أحكامه. وكل واحد من هذه الضوابط يجب أن يفشل. فإن نجح الاختبار رغم ذلك، فأحكامه ليست موصولة بتطبيقك أصلًا، وتسجّل Vera الحكم: غير حسّاس.
والاختبار غير الحسّاس يُرفَض بوصفه تغطية. له خانته الخاصة في خريطة التغطية، مرتّبة دون غير مُغطّى عن قصد: القاعدة غير المغطّاة تبدو على الأقل عملًا مؤجّلًا، أما القاعدة التي يغطّيها اختبار لا يستطيع الفشل فتبدو منجَزة وليست كذلك.
كيف أعرف أن الضبط السالب ليس تمثيلًا؟
لأنه تشغيل حقيقي في متصفح لا فحصًا ساكنًا، ولأنك ترى كل ضبط، وأي حكم زُيِّف فيه، وهل فشل. والضبط الذي ينجح يُعرَض بوصفه العطل الذي هو. ولا يُمَسّ إلا التوقّع — لا المُحدِّد أبدًا — فالضبط الذي يفشل إنما يفشل لأن التطبيق خالفه، لا لأن الاختبار لم يعد يجد الزرّ.
وهذا حدّه، فستكتشفه على أي حال: الحكم الذي يتحقّق فقط من وجود شيء لا توقّع فيه يُزيَّف. والاختبار المبني كله من هذا النوع يُبلَّغ عنه غير معروف لا حسّاسًا — فVera لا تمنحه شهادة سلامة لم يكسبها، وتطلب منك أن تحكم برسالة أو قيمة أو عنوان أو رمز حالة متوقَّع بدلًا من ذلك.
المعالجة الذاتية تبدو وكأنها تُخفي الأعطال. فإن تغيّر المحدِّد لأننا كسرنا الصفحة، تكونون قد غطّيتم على ذلك.
المعالجة تستبدل المُحدِّد لا التوقّع أبدًا. تُعاد الخطوة بمحدِّد جديد وبالحكم نفسه، وعلى ذلك الحكم أن ينجح — فإن كسرت الصفحة فشل الحكم وبقي التشغيل أحمر. والتوقّع، كفحص عنوان، لا يُشتقّ أبدًا من الصفحة الحيّة عن قصد؛ المُحدِّد وحده يُشتقّ. وهذا التباين هو خاصيّة الأمان كلها.
وحيث أنت محقّ: المعالجة قد تُخفي حذفًا مقصودًا — زرّ أردت إزالته يُعثَر عليه باسم جديد. لذلك تُحدَّد المعالجات بثلاث لكل تشغيل، وتُسجَّل كل واحدة في التقرير بالمحدِّد القديم والجديد، ومعالجة أثناء التشغيل لا تُعيد كتابة اختبارك المحفوظ أبدًا. هي تُعبِر التشغيل فوق فئة أُعيدت تسميتها، ولا تحرّر مجموعتك بهدوء.
ذكاء اصطناعي يحرّر مجموعة اختباراتي بلا إشراف أمر مرفوض تمامًا.
إذًا اتركه مطفأً، وهو مطفأ أصلًا. فالإصلاح التلقائي اختياري لكل مشروع، ويحتاج خطة مدفوعة ومفتاحك الخاص، ولا يمسّ إلا الاختبارات المحفوظة.
وحين يُشغَّل يتدرّج: معالجة، ثم اقتراح إصلاح، ثم تشخيص بقراءة شيفرتك — ولا يثبت الإصلاح إلا بعد أن ينجح الاختبار فعلًا عند إعادة التشغيل. لا شيء يُقبَل لأن نموذجًا بدا واثقًا. وكل تغيير يصل إلى سجلّ تدقيق للإضافة فقط، وقابل للتراجع.
الاختبارات المولَّدة ستكون متقلّبة وسأغرق في إنذارات كاذبة.
بعضها سيكون كذلك، والمكتوبة يدويًا كذلك أيضًا — فالتقلّب خاصيّة الاختبار الشامل لا خاصيّة من كتبه. وادّعاء غير ذلك هو الطريق الذي تُهجَر به المجموعات.
لذلك تقيسه Vera بدل إنكاره. لكل اختبار درجة تقلّب من 0 إلى 100، والنجاح بعد إعادة المحاولة يُعلَّم لا يُخفى، والعزل يُبقي الاختبار المتقلّب يعمل ويسجّل بينما يتوقّف عن حجب خط الأنابيب. ولا يُفشِل إجراء GitHub طلب دمج إلا على أعطال حقيقية؛ أما المعزول والناجح بعد إعادة المحاولة فيظهران تحذيرين. الهدف ليس تقلّبًا صفريًا، بل أن يظلّ الأحمر يعني شيئًا.
ماذا يحدث حين يخطئ الذكاء الاصطناعي في خطوة؟
تحصل على محرِّر، لا على مجلد تصدير. كل خطوة مُولَّدة تصل إلى البنّاء المرئي، فتصحّح الخطوة الخاطئة وتمضي — بلا كود، وبلا إعادة توليد المجموعة، وبلا انتظار توجيه أفضل.
وحين تُصلح Vera شيئًا بنفسها، لا يثبت الإصلاح إلا بعد أن ينجح الاختبار فعلًا. لا شيء يُقبَل لأن نموذجًا بدا واثقًا، وكل تغيير مسجَّل وقابل للتراجع.
«بلا كود» تعني أنني سأصطدم بسقف في الأسبوع الثاني.
ثمّة سقف فعلًا، ومن الجيد أن تعرف أين هو. تحته: 27 نوع خطوة، وشرط/بديل وحلقات بشروط على العناصر والعناوين والمتغيّرات، ومتغيّرات للمشروع ولكل بيئة، وتدفقات قابلة لإعادة الاستخدام تتشاركها الاختبارات، ونداءات HTTP مع استخراج بمسار JSON، وقيم تُلتقَط من صفحة وتُستخدَم في التالية.
وفوقه: إن احتاج اختبارك كودًا حرًّا في وسطه فVera ليست الشكل المناسب، ولا ينبغي أن تعاند ذلك. صدّر الاختبار Playwright قابلًا للتشغيل وخذه معك — وهذا المسار موجود تحديدًا ليكلّفك الاصطدام بالسقف نقرة لا إعادة كتابة.
لماذا أدفع مقابلها
أنا أدفع أصلًا لـ Claude وCursor. فلماذا أضيف فاتورة أخرى؟
أنت تدفع لهما ليكتبا كودًا. ولا واحد منهما يتذكّر أن الدفع كان يعمل أمس، ولا يلاحظ أنه توقّف هذا الصباح، ولا يحجب الدمج الذي كسره.
ولست تدفع مرتين مقابل النموذج: فالذكاء الاصطناعي في Vera يعمل على مفتاحك الحالي من Anthropic أو OpenAI أو Google. لا نعيد بيع أي رموز ولا نحسب أي أرصدة، فالاشتراك يشتري الجزء الذي لا يفعله مساعدك.
أنا آتي بمفتاح الذكاء الاصطناعي الخاص بي. فما الذي أدفع لكم مقابله فعلًا؟
كل ما ليس النموذج. الخطة المجانية حقيقية وكريمة بما يكفي للإجابة عن «هل تعمل على تطبيقي» — اختبارات وتشغيلات بلا حد، والمحرِّر، والمسجّل، والتوليد بمفتاحك، والوكيل المحلي، وتدقيق المواقع، والفيديو وتتبّعات الأعطال، وتقارير قابلة للمشاركة.
وتدفع حين يجب أن تعمل من دونك: تشغيلات مجدوَلة، وبيئات لكلٍّ رابطه وبيانات دخوله المختومة، وواجهة التكامل المستمر وحراسة طلبات الدمج، والعزل، واختبار الانحدار البصري، والتنبيهات. وتدفع أكثر حين يعتمد عليها أكثر من شخصين: أدوار مخصّصة، وسجلّ تدقيق، وخريطة التغطية، وسلاسل عبر المشاريع. تلك هي الفاتورة — تشغيل، لا ذكاء.
Playwright مجاني وفريقي يعرفه أصلًا.
والمُصرِّف مجاني كذلك، ومع ذلك تشتري الفرق أنظمة بناء. فكلفة الاختبار الشامل لم تكن يومًا في المشغِّل.
الكلفة أن من يعرف أي التدفقات مهمّة — الدعم، أو الجودة، أو المؤسّس — لا يستطيع غالبًا كتابة الكود، وأن المهندسين القادرين لديهم ما يشحنونه. والكلفة أن المجموعة تتحلّل كل دورة حتى يعلن أحدهم إفلاسها. فإن كان فريقك يصون فعلًا مجموعة Playwright صحيّة اليوم فأبقِها، ووجّه Vera إلى التدفقات التي لا تغطّيها.
يستطيع فريقي بناء هذا في دورة واحدة.
تستطيع بناء مشغِّل Playwright في دورة واحدة. ثم تملك مجمّع متصفحات لا يستنزف الجهاز، وتخزين ملفات مع سياسة احتفاظ، ومخطّط خطوات، وإعادات محاولة ودرجات تقلّب، وبيئات وبيانات دخول مختومة، ولقطات مرجعية بمراجعة قبول/رفض، وبثًّا حيًّا للتقدّم، وتحكّمًا بالأدوار، وسجلّ تدقيق، وواجهة يستعملها فعلًا من ليس مهندسًا.
هذه ليست دورة. هذه منتَج، مع مناوبة طوارئ. فإن كان كل ما تحتاجه Playwright داخل التكامل المستمر فابنِه — وهذا هو القرار الصحيح لبعض الفرق بصدق. وVera تستحقّ ثمنها حين يعجز من يعرف ما يجب اختباره عن كتابة الاختبارات.
لماذا أراهن عليكم
لا أريد ذكاءً اصطناعيًا يكتب اختباراتي. هل تنفعني Vera؟
نعم، ولست مضطرًا لتشغيله إطلاقًا. سجّل تدفقًا بالنقر داخل تطبيقك، أو استورد مجموعة لديك من Cypress أو Playwright أو WebdriverIO أو Selenium أو TestCafe أو Postman أو ملف HAR أو مواصفة OpenAPI، أو ابنِ الخطوات يدويًا في المحرِّر.
لا شيء في المسجّل ولا البنّاء ولا المشغّل ولا المجدوِل ولا إجراء التكامل المستمر ولا التقارير يستدعي نموذجًا. وحتى الإصلاح الذاتي متوقّف حتى يختاره المشروع صراحة. الذكاء الاصطناعي هنا ميزة، لا شرط.
ماذا تفعل Vera بشيفرتي وبيانات دخولي وبياناتي؟
يعمل الذكاء الاصطناعي على مفتاحك أنت من Anthropic أو OpenAI أو Google. وتُختَم المفاتيح وبيانات الدخول والجلسات الملتقَطة قبل أن تمسّ قاعدة البيانات، وهي للكتابة فقط عبر الواجهة — تُضبَط ولا تُقرأ ثانية. لا نعيد بيع أي رموز ولا نحسب أي أرصدة.
وحين تقرأ Vera مستودعك لتقترح إعدادات أو قواعد، فهي تقرأ فحسب: تفتح الملفات وتبحث فيها، ولا تستطيع كتابة ملف ولا تنفيذ أمر. والوكيل المحلي ينفّذ الاختبارات على جهازك، بجوار localhost — بلا نفق إلى شبكتك، وبلا وصول إلى قاعدة بياناتك.
لدينا 400 اختبار Cypress. الكلفة الحقيقية هي الترحيل لا أداتكم.
صحيح، فلا تُرحِّل. هذا هو الجواب الصريح، وهو نصيحتنا أيضًا: مجموعة Cypress لديك تعمل بالفعل، وتحويلها لا يشتري لك إلا المخاطرة.
وجِّه Vera إلى التدفقات التي لم تجد وقتًا لتغطيتها قط — تلك التي تنكسر في الإنتاج لأن أحدًا لم يجد وقتًا لكتابتها. وإن أردت بداية سريعة فالمستوردات تحوّل Cypress وPlaywright وWebdriverIO وSelenium وTestCafe وPostman وملفات HAR ومواصفات OpenAPI إلى خطوات قابلة للتحرير. وكن واضحًا مع نفسك بما تعطيه: الخطوات، لا مجموعة ناجحة. وسيبقى عليك تشغيلها وإصلاح ما ينكسر.
إن نجح الاختبار وشحنّا العطل رغم ذلك، فما الذي كنت أدفع مقابله؟
عندئذ لم يكن الاختبار يغطّي تلك الحالة، ولا توجد أداة على الأرض تستطيع أن تَعِدك بغير ذلك. وكل ما يدّعي ضمان ألّا تشحن عطلًا أبدًا فهو يبيعك شيئًا.
ما تفعله Vera هو تضييق الفجوة ورفض إخفائها: تُقاس التغطية مقابل دفتر قواعد اعتمدته أنت لا مقابل عدد اختبارات، والاختبار الذي لا يستطيع الفشل لا يُحتسَب، والمنع غير المرصود لا يُسجَّل، والقاعدة غير المغطّاة تُعرَض غير مغطّاة. ستظلّ تشحن أعطالًا. لكن ينبغي أن تستطيع بعدها أن ترى بالضبط أي قاعدة لم يكن لأحد اختبار حسّاس عليها.
أنتم شركة صغيرة. فلماذا أضع عملية إصداري عندكم؟
من العدل أن تحسبها، والتخفيفات ملموسة لا كلمات مطمئِنة. كل اختبار يُصدَّر كودًا قابلًا للتشغيل بصيغة Playwright أو WebdriverIO أو pytest أو TestCafe، وكل تشغيل بصيغة JUnit XML، فتغادر مجموعتك في صورة يصونها فريقك يدويًا — بلا صيغة مغلقة تحتاج إلى فكّها. والوكيل المحلي ينفّذ تلك الاختبارات على أجهزتك أنت لا على أجهزتنا.
وحصيلة ذلك: إن اختفينا، تفقد اللوحة والسجلّ، لا الاختبارات. وهذا أقصى ما يستطيع مزوّد أن يعرضه بصدق، وأكثر مما يفعله معظمهم.
ابدأ الآن
صِف ما تريد اختباره — ودَع Vera تبنيه وتشغّله وتُبقيه ناجحًا.
وجّه Vera إلى تطبيقك، واكتب جملة واحدة، وشاهِد اختبارات حقيقية تُولَّد وتنجح في ثوانٍ. خطة مجانية، مفتاحك الخاص، بلا بطاقة ائتمان.