我在自动化中运行了一个测试套件。所有这些测试都是功能性UI测试。它看起来像下面
public static List <GameObject> bullets = new List <GameObject> ();
public static List <Vector3> targets = new List <Vector3> ();
public float speed;
public override void Shot (Vector3 hitPoint) {
for (int i = 0; i < raysNumber; i++) {
direction = new Vector3 (UnityEngine.Random.Range (-splash, splash), UnityEngine.Random.Range (-splash, splash), 100);
direction = t_barrel.TransformDirection (direction);
if (Physics.Raycast (t_barrel.position, direction, out cele[i], 100, layer)) {
EnemyFPS enemyHealth = cele[i].collider.GetComponent <EnemyFPS> ();
BulletScript bullet = Instantiate (g_kubik, t_barrel.position, t_barrel.rotation) as BulletScript;
bullet.direction = (cele [i].point - t_barrel.position).normalized;
bullets.Add (bullet);
}
}
public override void MoveBullets () {
if (bullets.Count > 150) {
bullets.RemoveAt (0);
targets.RemoveAt (0);
}
for (int i = 0; i < bullets.Count; i++) {
bullets [i].transform.position += bullets [i].direction * speed * Time.deltaTime;
}
}
现在,问题是[SetUp]
public void Setup()
{
CreatePolicy();
}
[Test]
public void Test1()
{
EditPolicyAndValidateResults();
}
[Test]
public void Test2()
{
EditPolicyAndValidateResults();
}
[TearDown]
public void TearDown()
{
DeletePolicy();
}
有时会失败(对于一个或两个测试而言是随机的),并且因此相应的测试失败了。
如果已向DeletePolicy()
添加了try catch块,则可以避免失败,如下所示:
DeletePolicy()
由于测试[TearDown]
public void TearDown()
{
try
{
DeletePolicy();
}
catch(Exception ex)
{
// Do nothing
}
}
函数不是我的测试用例的意图,所以这种方法对我来说很好。这是正确的还是我在这里遗漏了什么?
答案 0 :(得分:1)
Unit Testing
的一般模式是:Arrange
,Act
然后是Assert
:AAA
。
Setup
只是以更好的方式Arrange
测试的指定方法(例如,通过重新设置任何先前模拟/存根的对象来节省时间并避免代码重复)。它绝不是强制性的,只是帮助测试编码器更好地编码的一种方法。
TearDown
再次以同样的方式成为帮助者,它比AAA
的通用概念更远,而不是Setup
。这是因为在AAA
中没有提到任何关于破坏或清理的事情。
所以,请随意忽略TearDown
中的任何失败,除非它在某种程度上很重要。也许你的眼睛里隐藏着一些东西,你还没有考虑到。对故障点进行另一个单元测试可能很重要,但这完全取决于你的情况。