هل اسم الاختبار هذا قليلاً فوق الجزء العلوي
-
30-09-2019 - |
سؤال
كما يوحي العنوان ، هل اسم الاختبار هذا مجرد القليل من الأعلى؟
WhenChargeIsGreaterThanRestingChargeButLessThanChargeRestApproachStep_OnUpdate_ChargeIsSetToRestingCharge
أي اقتراحات حول كيفية تحسين هذا؟ أم أنها بخير كما هي؟
فيما يلي جهاز الاختبار بأكمله كما هو الحال حتى تتمكن من الحصول على بعض السياق :)
public class NeuronTests
{
[Fact]
public void OnUpdate_NeuronFiresWhenChargeIsEqualToThreshold()
{
Neuron neuron = new Neuron();
bool fired = false;
neuron.Fired += (s, e) => fired = true;
neuron.Charge = Neuron.ChargeThreshold;
neuron.Update();
Assert.True(fired, "Neuron didn't fire");
}
[Fact]
public void OnUpdate_NeuronDoesntFireWhenChargeIsLessThanThreshold()
{
Neuron neuron = new Neuron();
bool fired = false;
neuron.Fired += (s, e) => fired = true;
neuron.Charge = Neuron.ChargeThreshold - 1f;
neuron.Update();
Assert.False(fired, "Neuron fired!");
}
[Fact]
public void OnUpdate_NeuronFiresWhenChargeIsGreaterThanThreshold()
{
Neuron neuron = new Neuron();
bool fired = false;
neuron.Fired += (s, e) => fired = true;
neuron.Charge = Neuron.ChargeThreshold + 1f;
neuron.Update();
Assert.True(fired, "Neuron didn't fire");
}
[Fact]
public void WhenNeuronFires_ChargeResetsToRestingCharge()
{
Neuron neuron = new Neuron();
neuron.Charge = Neuron.ChargeThreshold;
neuron.Update();
Assert.Equal(Neuron.RestingCharge, neuron.Charge);
}
[Fact]
public void AfterFiring_OnUpdate_NeuronWontFire()
{
Neuron neuron = new Neuron();
int fireCount = 0;
neuron.Fired += (s, e) => fireCount++;
neuron.Charge = Neuron.ChargeThreshold;
neuron.Update();
neuron.Charge = Neuron.ChargeThreshold;
neuron.Update();
Assert.Equal(1, fireCount);
}
[Fact]
public void WhenResting_OnUpdate_NeuronWillFire()
{
Neuron neuron = new Neuron();
int fireCount = 0;
neuron.Fired += (s, e) => fireCount++;
neuron.Charge = Neuron.ChargeThreshold;
neuron.Update();
neuron.Charge = Neuron.ChargeThreshold;
neuron.Update();
neuron.Charge = Neuron.ChargeThreshold;
neuron.Update();
Assert.Equal(2, fireCount);
}
[Fact]
public void WhenChargeIsGreaterThanRestingCharge_OnUpdate_ChargeDecreasesTowardsRestingCharge()
{
Neuron neuron = new Neuron();
neuron.Charge = Neuron.RestingCharge + (2 * Neuron.ChargeRestApproachStep);
neuron.Update();
Assert.Equal(Neuron.RestingCharge + Neuron.ChargeRestApproachStep, neuron.Charge);
}
[Fact]
public void WhenChargeIsGreaterThanRestingChargeButLessThanChargeRestApproachStep_OnUpdate_ChargeIsSetToRestingCharge()
{
Neuron neuron = new Neuron();
neuron.Charge = Neuron.RestingCharge + (Neuron.ChargeRestApproachStep * 0.5f);
neuron.Update();
Assert.Equal(Neuron.RestingCharge, neuron.Charge);
}
}
المحلول
رأيي الشخصي هو أن أسماء الأسلوب لا يمكن أن تكون طويلة جدًا ، طالما أنها وصفية.
تميل أسماء اختبار الوحدة إلى أن تكون أطول بكثير ، حيث يجب أن تحتوي على مزيد من المعلومات. هذا جيد بالنسبة لي أيضًا ، نظرًا لأنها تظهر فقط في توقيع الطريقة وفي قائمة الاختبارات الخاصة بك (وهذا هو المكان الذي تريد أن يكون فيه اسم جيد) ، فلن تتصل بهم أبدًا من أي رمز آخر.
نصائح أخرى
تتمثل إحدى الطرق الشائعة في اختبارات تخطيط مثل هذه في استخدام الفئات المتداخلة مع المفردات المعطى/ثم/ثم اكتب على النحو المقترح من خلال ممارسات BDD النموذجية ، على سبيل المثال
public class NeuronStory
{
public class GivenChargeIsGreaterThanRestingCharge
{
public class GivenChargeIsLessThanChargeRestApproachStep
{
public class WhenUpdated
{
public void ThenChargeIsSetToRestingCharge()
{
}
}
}
}
}
وبهذه الطريقة يمكنك أيضًا أن تعشش الاختبارات الأخرى التي تتناسب أيضًا مع GivenChargeIsGreaterThanRestingCharge
قصة في نفس المكان.
تعطي السطح أدلة على ما تعتقد أنه ينبغي نقله من اسم الطريقة.
- حرك ما هو قيد الاختبار لاسم الفصل.
- انقل ما يجب أن تكون نتيجة الاختبار إلى بيان التأكيد (تعليق إذا لزم الأمر). لماذا ا؟ إذا تغير التأكيد في الاختبار على الإطلاق ، فهل يجب أن يتغير اسم الاختبار؟
ثم يمكن أن يكون لديك:
public class NeuronOnUpdateTests
{
public void WhenChargeIsBetweenRestingChargeAndChargeRestApproachStep
{
//Charge is set to resting state
Assert.True(x);
}
}
إنه طويل بعض الشيء ، يريد المشرفون قراءة الوظيفة للحصول على فكرة سريعة عن ما تفعله الوظيفة ، حيث يجعل وجود شيء طويل أسرع لقراءة الوظيفة نفسها.
هذا ينطبق على الاختبارات أيضا. عندما أشعر بالحاجة إلى كتابة مقال كعنوان وظيفة ، أخرج "عندما يكون" "هو" والكلمات المتكررة ... مغادرة:
ChargeGreaterThanrestingButlessHanrestApproachStep_Onupdate_ChargesetTorEsting
ليس أقل وصفية بكثير ، وأكثر قابلية للقراءة بسهولة ...
كما تقول إعلانات Windows Phone 7 "المزيد من النظرة والذهاب"
جانبا ، طريقة واحدة (بالتأكيد ليست الطريقة الوحيدة) لاختبارات التسمية هي كتابة اسم الاختبار الخاص بك كتأكيد.
مثال بسيط (ساذج):
int Add(object a, object b)
{
return a+b;
}
[TestMethod]
void AddFailsWithNonIntegerArguments()
{
try
{
Add("Hello", "World");
Assert::Fail();
}
catch
{
Assert::Pass();
}
}
على السؤال الرئيسي ، أعتقد أن أسماء وظائف الاختبار الطويلة جيدة ، طالما أنها لا لبس فيها