ডিফল্টভাবে নুনিট পরীক্ষাগুলি বর্ণানুক্রমিকভাবে চালিত হয়। ফাঁসির আদেশটি সেট করার কোনও উপায় কি কেউ জানেন? এর জন্য কোনও অ্যাট্রিবিউট কি বিদ্যমান?
ডিফল্টভাবে নুনিট পরীক্ষাগুলি বর্ণানুক্রমিকভাবে চালিত হয়। ফাঁসির আদেশটি সেট করার কোনও উপায় কি কেউ জানেন? এর জন্য কোনও অ্যাট্রিবিউট কি বিদ্যমান?
উত্তর:
আপনার ইউনিট পরীক্ষা প্রতিটি স্বতন্ত্রভাবে চালানো এবং একা দাঁড়িয়ে থাকতে হবে। তারা যদি এই মানদণ্ডকে সন্তুষ্ট করে তবে অর্ডারটি কোনও বিষয় নয়।
এমন কিছু অনুষ্ঠান রয়েছে যেখানে আপনি প্রথমে কিছু নির্দিষ্ট পরীক্ষা চালাতে চাইবেন। একটি সাধারণ উদাহরণ ক্রমাগত সংহতকরণ পরিস্থিতিতে যেখানে কিছু পরীক্ষা অন্যদের চেয়ে দীর্ঘায়িত হয়। আমরা বিভাগের বৈশিষ্ট্যটি ব্যবহার করি যাতে আমরা পরীক্ষাগুলি চালাতে পারি যা পরীক্ষাগুলি ব্যবহার করে যেগুলি পরীক্ষা করে সামনে উপহাস করে।
যেমন আপনার দ্রুত পরীক্ষার শুরুতে এটি রাখুন
[Category("QuickTests")]
আপনার যেখানে পরীক্ষা রয়েছে যা নির্দিষ্ট পরিবেশের অবস্থার উপর নির্ভরশীল, সেখানে টেস্টফাইচারসেটআপ এবং টেস্টফাইচারটাইয়ারডাউন বৈশিষ্ট্যগুলি বিবেচনা করুন , যা আপনাকে পরীক্ষাগুলির আগে এবং পরে কার্যকর করার পদ্ধতিগুলি চিহ্নিত করতে দেয়।
আমি কেবল এটিই উল্লেখ করতে চাই যে বেশিরভাগ প্রতিক্রিয়াকারীরা এগুলি ইউনিট পরীক্ষা বলে ধরেছিলেন, প্রশ্নটি তারা নির্দিষ্ট ছিল না।
nUnit একটি দুর্দান্ত সরঞ্জাম যা বিভিন্ন পরীক্ষার পরিস্থিতিতে ব্যবহার করা যেতে পারে। আমি পরীক্ষার ক্রম নিয়ন্ত্রণ করতে চাওয়ার উপযুক্ত কারণ দেখতে পাচ্ছি।
এই পরিস্থিতিতে আমাকে রান অর্ডারের পরীক্ষার নামে অন্তর্ভুক্ত করার জন্য অবলম্বন করতে হয়েছিল। কোনও অ্যাট্রিবিউট ব্যবহার করে রান অর্ডার নির্দিষ্ট করতে সক্ষম হওয়ায় দুর্দান্ত হবে।
001_first_test
002_second_test
এবং আরও কি?
নুনিট ৩.২.০ একটি যোগ করেছে OrderAttribute
, দেখুন:
https://github.com/nunit/docs/wiki/Order-Attribute
উদাহরণ:
public class MyFixture
{
[Test, Order(1)]
public void TestA() { ... }
[Test, Order(2)]
public void TestB() { ... }
[Test]
public void TestC() { ... }
}
একটি নির্দিষ্ট ক্রমে পরীক্ষা চালানোর অর্থ এই নয় যে পরীক্ষাগুলি একে অপরের উপর নির্ভরশীল - আমি এই মুহুর্তে একটি টিডিডি প্রকল্পে কাজ করছি, এবং একটি ভাল টিডিডার হওয়ায় আমি সমস্ত বিষয়কে ঠাট্টা / অনড় করেছি, তবে এটি তৈরি করবে যদি আমি পরীক্ষার ফলাফলগুলি প্রদর্শিত হয় এমন ক্রমটি নির্দিষ্ট করতে পারি - বর্ণমালার পরিবর্তে থিম্যাটিকের পরিবর্তে এটি আরও পাঠযোগ্য able এখন পর্যন্ত কেবলমাত্র আমি ভাবতে পারি তা হল_এ_বি_সি_ ক্লাসে ক্লাস, নেমস্পেস এবং পদ্ধতিতে প্রিপেন্ড করা। (সুন্দর নয়) আমি মনে করি একটি [টেস্টঅর্ডারঅ্যাট্রিবিউট] বৈশিষ্ট্যটি দুর্দান্ত হবে - কাঠামোটি কঠোরভাবে অনুসরণ করা হবে না, তবে একটি ইঙ্গিত যাতে আমরা এটি অর্জন করতে পারি
টেস্টগুলি অর্ডার নির্ভর কিনা তা নির্বিশেষে ... আমাদের মধ্যে কিছু কিছু সুশৃঙ্খলভাবে কেবল সবকিছু নিয়ন্ত্রণ করতে চায়।
ইউনিট পরীক্ষা সাধারণত জটিলতার ক্রমে তৈরি করা হয়। সুতরাং, কেন এগুলিও জটিলতার ক্রমে চালানো উচিত নয়, বা যে ক্রমে সেগুলি তৈরি করা হয়েছিল?
ব্যক্তিগতভাবে, আমি টেস্টগুলি যেভাবে তৈরি করেছি সেগুলি দেখতে দেখতে আমি পছন্দ করি। টিডিডিতে প্রতিটি ক্রমাগত পরীক্ষা স্বাভাবিকভাবেই আরও জটিল হতে চলেছে, এবং চালাতে আরও বেশি সময় নেয়। আমি বরং প্রথমে সহজ পরীক্ষাটি ব্যর্থ হতে দেখি কারণ এটি ব্যর্থতার কারণ হিসাবে এটি আরও ভাল সূচক হবে।
তবে, এগুলি এলোমেলো ক্রমে চালানোর সুবিধাটিও আমি দেখতে পাচ্ছি, বিশেষ করে যদি আপনি পরীক্ষা করতে চান যে আপনার পরীক্ষাগুলির অন্যান্য পরীক্ষার উপর কোনও নির্ভরতা নেই। "রান টেস্ট এলোমেলোভাবে থামানো পর্যন্ত" রানারদের পরীক্ষা করার বিকল্প বিকল্প সম্পর্কে কীভাবে?
আমি সেলেনিয়ামের সাথে মোটামুটি জটিল ওয়েব সাইটে পরীক্ষা করছি এবং পুরো টেস্টের স্যুটটি আধা ঘণ্টারও বেশি সময় ধরে চালাতে পারে এবং আমি এখনও পুরো অ্যাপ্লিকেশনটি coveringাকা দেওয়ার কাছাকাছি নেই। যদি আমাকে নিশ্চিত করতে হয় যে সমস্ত পূর্ববর্তী সমস্ত ফর্মগুলি প্রতিটি পরীক্ষার জন্য সঠিকভাবে পূরণ করা হয়েছে তবে এটি সামগ্রিক পরীক্ষায় খুব অল্প সময়ের সাথে সামান্য পরিমাণে যোগ করে। পরীক্ষা চালানোর জন্য যদি খুব বেশি ওভারহেড থাকে, লোকেরা তাদের যতবার করা উচিত ততবার চালায় না।
সুতরাং, আমি সেগুলিকে যথাযথভাবে রেখেছি এবং পাঠ্য বাক্সগুলি এবং এরকম সম্পন্ন করার জন্য পূর্ববর্তী পরীক্ষার উপর নির্ভর করি। প্রাক-শর্তগুলি বৈধ না হলে আমি অ্যাসেটর ব্যবহার করুন gn (উপেক্ষা করুন) ব্যবহার করুন, তবে সেগুলি ক্রমক্রমে চালানো দরকার।
আমি সত্যিই আগের উত্তর পছন্দ।
অর্ডার সীমাটি নির্ধারণ করতে কোনও অ্যাট্রিবিউট ব্যবহার করতে সক্ষম হতে আমি এটি সামান্য পরিবর্তন করেছি:
namespace SmiMobile.Web.Selenium.Tests
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using NUnit.Framework;
public class OrderedTestAttribute : Attribute
{
public int Order { get; set; }
public OrderedTestAttribute(int order)
{
Order = order;
}
}
public class TestStructure
{
public Action Test;
}
class Int
{
public int I;
}
[TestFixture]
public class ControllingTestOrder
{
private static readonly Int MyInt = new Int();
[TestFixtureSetUp]
public void SetUp()
{
MyInt.I = 0;
}
[OrderedTest(0)]
public void Test0()
{
Console.WriteLine("This is test zero");
Assert.That(MyInt.I, Is.EqualTo(0));
}
[OrderedTest(2)]
public void ATest0()
{
Console.WriteLine("This is test two");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
}
[OrderedTest(1)]
public void BTest0()
{
Console.WriteLine("This is test one");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
}
[OrderedTest(3)]
public void AAA()
{
Console.WriteLine("This is test three");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
}
[TestCaseSource(sourceName: "TestSource")]
public void MyTest(TestStructure test)
{
test.Test();
}
public IEnumerable<TestCaseData> TestSource
{
get
{
var assembly =Assembly.GetExecutingAssembly();
Dictionary<int, List<MethodInfo>> methods = assembly
.GetTypes()
.SelectMany(x => x.GetMethods())
.Where(y => y.GetCustomAttributes().OfType<OrderedTestAttribute>().Any())
.GroupBy(z => z.GetCustomAttribute<OrderedTestAttribute>().Order)
.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
foreach (var order in methods.Keys.OrderBy(x => x))
{
foreach (var methodInfo in methods[order])
{
MethodInfo info = methodInfo;
yield return new TestCaseData(
new TestStructure
{
Test = () =>
{
object classInstance = Activator.CreateInstance(info.DeclaringType, null);
info.Invoke(classInstance, null);
}
}).SetName(methodInfo.Name);
}
}
}
}
}
}
OrderedTest
NUnit 3 এ আর সমর্থিত নয়
আমি জানি এটি তুলনামূলকভাবে পুরাতন পোস্ট, তবে পরীক্ষার নামগুলি বিশ্রী না করেই আপনার পরীক্ষাটি নিয়মিত রাখার আরও একটি উপায়। টেস্টকেসোর্স অ্যাট্রিবিউটটি ব্যবহার করে এবং আপনি যে বস্তুটি পাস করেন তাতে একটি প্রতিনিধি (অ্যাকশন) থাকে, আপনি কেবলমাত্র অর্ডারটিকে নিয়ন্ত্রণ করতে পারবেন না তবে এটি পরীক্ষার নামও রাখতে পারেন।
এটি কাজ করে কারণ ডকুমেন্টেশন অনুসারে সংগ্রহের আইটেমগুলি পরীক্ষার উত্স থেকে ফিরে আসা সর্বদা তাদের তালিকাভুক্ত ক্রমে কার্যকর করা হবে।
আমি আগামীকাল দিচ্ছি একটি উপস্থাপনা থেকে একটি ডেমো এখানে:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
namespace NUnitTest
{
public class TestStructure
{
public Action Test;
}
class Int
{
public int I;
}
[TestFixture]
public class ControllingTestOrder
{
private static readonly Int MyInt= new Int();
[TestFixtureSetUp]
public void SetUp()
{
MyInt.I = 0;
}
[TestCaseSource(sourceName: "TestSource")]
public void MyTest(TestStructure test)
{
test.Test();
}
public IEnumerable<TestCaseData> TestSource
{
get
{
yield return new TestCaseData(
new TestStructure
{
Test = () =>
{
Console.WriteLine("This is test one");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
}
}).SetName(@"Test One");
yield return new TestCaseData(
new TestStructure
{
Test = () =>
{
Console.WriteLine("This is test two");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
}
}).SetName(@"Test Two");
yield return new TestCaseData(
new TestStructure
{
Test = () =>
{
Console.WriteLine("This is test three");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
}
}).SetName(@"Test Three");
}
}
}
}
TestCaseSource
পরীক্ষা চালানোর উপায় হিসাবে ব্যবহার করা বুদ্ধিমানের স্ট্রোক। সাবাশ. আমি নীচের সাথে এই পদ্ধতির সাথে নিয়েছি এবং এটির ব্যবহার আরও সহজ করার জন্য কয়েকটি অতিরিক্ত পরিবর্তন যুক্ত করেছি। অতিরিক্ত তথ্যের জন্য আমার উত্তরের লিঙ্কগুলি দেখুন, তবে অন্তর্নিহিত ধারণাটি এই দুর্দান্ত উত্তর থেকে!
TestCaseSource
অবশ্যই স্থির হতে হবে, যা প্যাটার্নটি ব্যবহার করে বিরত থাকে। হতাশাজনক।
TestCaseSource
অবশ্যই NUnit 3 এ স্ট্যাটিক অবজেক্ট হতে হবে, বা পরীক্ষাগুলি কার্যকর হবে না ute এবং আপনি একটি স্ট্যাটিক অবজেক্টের মধ্যে ডায়নামিক অবজেক্ট তৈরি করতে পারবেন না। সে কারণেই এটি v। 3 তে কাজ করবে না
আমি সি # তে লিখিত সেলেনিয়াম ওয়েবড্রাইভার এন্ড-টু-এন্ড ইউআই টেস্ট কেসগুলির সাথে কাজ করছি যা NUnit ফ্রেমওয়ার্ক ব্যবহার করে চালিত হয়। (ইউনিট ক্ষেত্রে যেমন নয়)
এই ইউআই পরীক্ষাগুলি অবশ্যই মৃত্যুদন্ডের আদেশের উপর নির্ভর করে, কারণ অন্যান্য পরীক্ষার পূর্বশর্ত হিসাবে কিছু ডেটা যুক্ত করা দরকার। (প্রতিটি পরীক্ষায় পদক্ষেপগুলি করা সম্ভব হবে না)
এখন, দশম পরীক্ষার কেস যুক্ত করার পরে, আমি দেখতে পাচ্ছি নুনিত এই ক্রমে চালাতে চায়: টেস্ট_1 টেস্ট_০ টেস্ট_০ টেস্ট_২ টেস্ট_৪।
সুতরাং আমি অনুমান করি যে আপাতত পরীক্ষার কেসের নামগুলিও আমার খুব বর্ণমালা করতে হবে, তবে এক্সিকিউশন অর্ডার নিয়ন্ত্রণের এই ক্ষুদ্র বৈশিষ্ট্যটি নুনিতে যুক্ত করা ভাল হবে।
সাধারণত ইউনিট টেস্টটি স্বতন্ত্র হওয়া উচিত, তবে যদি আপনার অবশ্যই হয় তবে আপনি আপনার পদ্ধতিগুলি বর্ণানুক্রমিক ক্রমে নাম রাখতে পারেন যেমন:
[Test]
public void Add_Users(){}
[Test]
public void Add_UsersB(){}
[Test]
public void Process_Users(){}
বা আপনি করতে পারেন ..
private void Add_Users(){}
private void Add_UsersB(){}
[Test]
public void Process_Users()
{
Add_Users();
Add_UsersB();
// more code
}
a_
b_
t1_
, এর t2_
পরিবর্তে বা পিছনের চরিত্রগুলি মিস করার সহজ উপর নির্ভর করে থাকেন
টেস্ট অর্ডারিং প্রক্রিয়াটি ব্যবহার করার জন্য খুব ভাল কারণ রয়েছে। আমার নিজের পরীক্ষাগুলির বেশিরভাগই ভাল অভ্যাস যেমন সেটআপ / টিয়ারডাউন ব্যবহার করে। অন্যদের জন্য বিপুল পরিমাণে ডেটা সেটআপের প্রয়োজন হয়, যা এরপরে বিভিন্ন বৈশিষ্ট্য পরীক্ষা করতে ব্যবহার করা যেতে পারে। এখন অবধি, আমি এই (সেলেনিয়াম ওয়েবড্রাইভার) ইন্টিগ্রেশন টেস্টগুলি পরিচালনা করতে বড় পরীক্ষা ব্যবহার করেছি। তবে আমি মনে করি https://github.com/nunit/docs/wiki/Order- এ উপরের প্রস্তাবিত পোস্টটির অনেক যোগ্যতা রয়েছে। অর্ডার কেন অত্যন্ত মূল্যবান হতে পারে তার একটি উদাহরণ এখানে রয়েছে:
এই 10 মিনিটের অপেক্ষার সময়টি পরীক্ষার স্যুটটি ধীর করে দেয়। আপনি যখন বহু পরীক্ষার অনুরূপ ক্যাশে বিলম্বকে বহুগুণ করেন তখন এটি অনেক সময় ব্যয় করে। অর্ডারিং টেস্টগুলি টেস্ট স্যুটটির শুরুতে ডেটা সেটআপটিকে "টেস্ট" হিসাবে সম্পন্ন করার অনুমতি দিতে পারে, পরীক্ষাগুলি ক্যাশের উপর নির্ভর করে পরীক্ষা চালানোর শেষের দিকে চালানো হয়।
এই প্রশ্নটি এখন সত্যই পুরানো, তবে যারা অনুসন্ধানে এটি পৌঁছতে পারে তাদের জন্য, আমি ব্যবহারকারী 3275462 এবং প্রাইভটিভান্ডালস / রিকোর কাছ থেকে দুর্দান্ত উত্তর নিয়েছি এবং সেগুলি আমার নিজস্ব আপডেটের সাথে একটি গিটহাবের সংগ্রহস্থলে যুক্ত করেছি । আমি একটি সম্পর্কিত ব্লগ পোস্টও তৈরি করেছিআপনি আরও তথ্যের জন্য দেখতে পারেন এমন কিছু অতিরিক্ত তথ্যের সাথে ।
আশা করি এটি আপনার সকলের জন্য সহায়ক। এছাড়াও, আমি প্রায়শই আমার প্রকৃত ইউনিট পরীক্ষাগুলি থেকে আমার একীকরণের পরীক্ষা বা অন্যান্য প্রান্ত থেকে শেষের টেস্টগুলিকে পৃথক করতে বিভাগ বৈশিষ্ট্যটি ব্যবহার করতে চাই। অন্যরা উল্লেখ করেছে যে ইউনিট পরীক্ষাগুলিতে অর্ডার নির্ভরতা থাকা উচিত নয়, তবে অন্যান্য পরীক্ষার ধরণগুলি প্রায়শই তাই ঘটে তাই কেবলমাত্র আপনি চান এমন পরীক্ষার বিভাগটি চালানোর জন্য এবং সেই প্রান্ত থেকে শেষ পরীক্ষাগুলির অর্ডার দেওয়ার জন্য এটি একটি দুর্দান্ত উপায় সরবরাহ করে।
আমি অবাক হয়ে NUnit সম্প্রদায় কিছু নিয়ে আসেনি, তাই আমি নিজেই এই জাতীয় কিছু তৈরি করতে গিয়েছিলাম।
আমি বর্তমানে একটি ওপেন-সোর্স লাইব্রেরি বিকাশ করছি যা আপনাকে NUnit দিয়ে আপনার পরীক্ষাগুলি অর্ডার করতে দেয়। আপনি টেস্ট ফিক্সচারগুলি অর্ডার করতে পারেন এবং একইভাবে "অর্ডার করা টেস্টের নির্দিষ্টকরণগুলি" অর্ডার করতে পারেন।
গ্রন্থাগারটি নিম্নলিখিত বৈশিষ্ট্যগুলি সরবরাহ করে:
লাইব্রেরিটি আসলে এমএসটিস্টে কীভাবে .orderedtest
ফাইলগুলির সাথে টেস্টের অর্ডার দেয় in নীচের উদাহরণ দেখুন।
[OrderedTestFixture]
public sealed class MyOrderedTestFixture : TestOrderingSpecification {
protected override void DefineTestOrdering() {
TestFixture<Fixture1>();
OrderedTestSpecification<MyOtherOrderedTestFixture>();
TestFixture<Fixture2>();
TestFixture<Fixture3>();
}
protected override bool ContinueOnError => false; // Or true, if you want to continue even if a child test fails
}
আপনি যদি ব্যবহার করেন [TestCase]
তবে যুক্তিটি TestName
পরীক্ষার জন্য একটি নাম সরবরাহ করে।
যদি নির্দিষ্ট না করা থাকে তবে পদ্ধতির নাম এবং প্রদত্ত যুক্তিগুলির ভিত্তিতে একটি নাম উত্পন্ন হয়।
আপনি নীচে প্রদত্ত পরীক্ষার ক্রয়ের আদেশ নিয়ন্ত্রণ করতে পারেন:
[Test]
[TestCase("value1", TestName = "ExpressionTest_1")]
[TestCase("value2", TestName = "ExpressionTest_2")]
[TestCase("value3", TestName = "ExpressionTest_3")]
public void ExpressionTest(string v)
{
//do your stuff
}
এখানে আমি "ExpressionTest"
একটি সংখ্যার সাথে পদ্ধতির নাম প্রত্যয় ব্যবহার করেছি ।
আপনি বর্ণনামূলকভাবে অর্ডার করা কোনও নাম টেস্ট কেস অ্যাট্রিবিউট দেখতে ব্যবহার করতে পারেন
পরীক্ষার কাঠামো কার্যকর করার জন্য যে পরীক্ষাটি পরীক্ষা করে তা আপনার উপর নির্ভর করবে না।টেস্টগুলি বিচ্ছিন্ন এবং স্বতন্ত্র হওয়া উচিত। এতে তাদের জন্য মঞ্চ নির্ধারণ করা বা তাদের পরে পরিষ্কার করার জন্য অন্য কোনও পরীক্ষার উপর নির্ভর করা উচিত নয়। পরীক্ষাগুলি কার্যকর করার আদেশ নির্বিশেষে তাদেরও একই ফল উত্পন্ন করা উচিত (এসইউটির প্রদত্ত স্ন্যাপশটের জন্য)
আমি কিছুটা গুগল করেছিলাম। যথারীতি, কিছু লোক ছদ্মবেশী কৌশল অবলম্বন করেছে (অন্তর্নিহিত টেস্টাবিলিটি / ডিজাইনের সমস্যাটি সমাধান করার পরিবর্তে)
আরও দেখুন: একটি ভাল পরীক্ষার বৈশিষ্ট্য
TestCaseSource
কীটি ব্যবহারের ক্ষেত্রে override string ToString
পদ্ধতিটি হল , এটি কীভাবে কাজ করে:
ধরুন আপনার টেস্টকেস ক্লাস রয়েছে
public class TestCase
{
public string Name { get; set; }
public int Input { get; set; }
public int Expected { get; set; }
}
এবং টেস্ট কেসগুলির একটি তালিকা:
private static IEnumerable<TestCase> TestSource()
{
return new List<TestCase>
{
new TestCase()
{
Name = "Test 1",
Input = 2,
Expected = 4
},
new TestCase()
{
Name = "Test 2",
Input = 4,
Expected = 16
},
new TestCase()
{
Name = "Test 3",
Input = 10,
Expected = 100
}
};
}
এখন এটি একটি পরীক্ষার পদ্ধতি সহ ব্যবহার করুন এবং দেখুন কী ঘটে:
[TestCaseSource(nameof(TestSource))]
public void MethodXTest(TestCase testCase)
{
var x = Power(testCase.Input);
x.ShouldBe(testCase.Expected);
}
এটি ক্রমে পরীক্ষা করবে না এবং আউটপুটটি এর মতো হবে:
সুতরাং আমরা যদি override string ToString
আমাদের ক্লাসে যুক্ত করি তবে :
public class TestCase
{
public string Name { get; set; }
public int Input { get; set; }
public int Expected { get; set; }
public override string ToString()
{
return Name;
}
}
ফলাফল পরিবর্তন হবে এবং আমরা পরীক্ষার অর্ডার এবং নামটি পেয়েছি:
বিঃদ্রঃ: