단위 테스트 일관성없는 통과 또는 실패 결과
-
14-11-2019 - |
문제
내 유닛 테스트 중 하나가 실행할 때 무작위로 통과하거나 실패하는 것처럼 보입니다.이것이 일어나는 이유에 대해 나에게 이해가되는 유일한 것은 테스트가 실행될 때마다 데이터베이스의 데이터가 다른 상태로 들어갑니다.하지만 각 테스트에서 데이터베이스를 롤백하기 위해 트랜잭션을 사용합니다....에다음은 내 기본 단위 테스트 클래스와 문제가있는 장치 테스트 클래스입니다.내가 누락되었을지도 모르는 것을 볼 수 있거나 무엇을 찾아야 하는지를 볼 수 있습니까?
TestDriven.net 및 Visual Studio Unit 테스트 프레임 워크에서 발생합니다.
.
Partial Public MustInherit Class TestBase
Private _scope As Transactions.TransactionScope
<DebuggerStepThrough()> _
<TestInitialize()> _
Public Sub Setup()
//'Start the Distribution Transaction Coordinator, if it's not already running.
Using dtcService As New System.ServiceProcess.ServiceController("Distributed Transaction Coordinator", My.Computer.Name)
If dtcService.Status = ServiceProcess.ServiceControllerStatus.Stopped Then
dtcService.Start()
End If
End Using
_scope = New TransactionScope(TransactionScopeOption.RequiresNew, New TimeSpan(0))
End Sub
<DebuggerStepThrough()> _
<TestCleanup()>
Public Sub Teardown()
If _scope IsNot Nothing Then
_scope.Dispose()
End If
End Sub
<System.Diagnostics.DebuggerStepThrough()> _
Public Shared Function ExecSql(ByVal sql As String) As System.Data.DataTable
Dim connStr = GlobalSettings.GetConnectionString()
Using conn As New System.Data.SqlClient.SqlConnection(connStr)
conn.Open()
Dim cmd As New System.Data.SqlClient.SqlCommand(sql.ToString, conn)
Dim adapter As System.Data.SqlClient.SqlDataAdapter = New System.Data.SqlClient.SqlDataAdapter(cmd)
Dim dt As System.Data.DataTable = New System.Data.DataTable
adapter.Fill(dt)
Return dt
If conn.State <> System.Data.ConnectionState.Closed Then
conn.Close()
End If
conn.Dispose()
End Using
End Function
End Class
여기에 내 단위 테스트가 있습니다 :
.Partial Public Class CampaignEmailSendLimitServiceTests
Inherits TestBase
Private _service = ServiceManager.Current.MyService
<TestMethod()> _
Public Sub MyTest()
//' Set the pre-test condition.
ExecSql("update base.dbo.tblTableA set someDate = '2010-06-28' where id = 56937 ")
//' Run the service
_service.Process()
//' Verify the expected result
Dim dt = ExecSql("select deliveryDate from tblTableB ")
Assert.AreEqual(False, dt.Rows(0).IsNull("deliveryDate"))
End Sub
End Class
해결책 3
나는 마침내 무슨 일이 일어나고 있는지 알아 냈습니다.그것은 거래와 아무 관련이 없습니다.그게 다 멋지다.그것은 디자인에 의해 일관성없는 행동을 창출하는 것이 나의 과정이었습니다.발견 된 다른 순위가없는 경우 납기를 결정하기 위해 "임의 순위"가있는 프로세스의 일부가있었습니다.단위 테스트는 비즈니스 규칙을보다 잘 반영하도록 재 작성되어야합니다.
다른 팁
이것은 항상 나를 위해 잘 작동했습니다.내가 본 주된 차이점은 transactionscopeoption.required를 사용하는 것입니다.
[TestClass()]
public class MyTest: DatabaseTestClass
{
public MyTest()
{
InitializeComponent();
}
TransactionScope ambientTransaction;
[TestInitialize()]
public void TestInitialize()
{
ambientTransaction = new TransactionScope(TransactionScopeOption.Required);
base.InitializeTest();
}
[TestCleanup()]
public void TestCleanup()
{
ambientTransaction.Dispose();
base.CleanupTest();
}
}
. DataAdapter.Fill을 사용하여 업데이트를 실행하는 이유는 무엇입니까?SELECT 문을 사용하여 DATATABLES를 채우도록 설계되었습니다.
내 추측은 처음에는 ExecSQL을 사용하여 데이터베이스에 아무 것도 쓸 수 없다는 것입니다.
및 두 번째 일.이 주장은 가능한 한 읽을 수없는 것입니다. 나는 를 바꿀 것이다
Assert.AreEqual(False, dt.Rows(0).IsNull("deliveryDate"));
.
~
Assert.IsFalse(dt.Rows(0).IsNull("deliveryDate"));
.
또는
Assert.That(dt.Rows(0)("deliveryDate"), Is.Not.Null));
.
읽을 수없는 테스트는 사용자가 당신을 늦추기 때문에 단위 테스트가 나쁘다고 말하는 이유 중 하나입니다.가능한 한 읽고 이해하기 쉽고 단위 테스트를해야합니다.단위 테스트에 대한 주장이 없으므로)
VB.NET을 사용하지 않는 것처럼 몇 가지 오타가있을 수 있습니다.주장 된 예제는 nunit의 것입니다.