gpt4 book ai didi

unit-testing - 如何对使用相同私有(private)方法的公共(public)方法进行单元测试?

转载 作者:行者123 更新时间:2023-12-04 05:30:56 24 4
gpt4 key购买 nike

我的软件测试需要一些指导。

我把事情搞得太复杂了,但我太专注了,看不出我做错了什么,或者看不到另一种做事的方法。

我有几个使用相同私有(private)方法的公共(public)方法。

私有(private)方法本身:

  • 必须为其特定角色处理许多场景
  • 在同一实例中与字段/属性/方法密切合作

说私有(private)方法需要5个测试覆盖所有场景,被6个公有方法使用。

问题

  • 我是否需要至少 5x6 测试?

  • 如何为每个公共(public)方法重复使用私有(private)方法的测试?

  • 是否有任何关于重构重复测试的示例/文章?

示例

OnStartup()

- if_file_exists_load_entries           ()
- if_file_missing_load_last ()
- if_no_files_create_new_entries ()
- if_exception_clear_entries_and_log ()
- loaded_entries_init_called ()
- Other tests

OnUserLoadCustom()

- if_file_exists_load_entries           _AND_STORE_AS_LAST()
- if_file_missing_load_last _AND_STORE_AS_LAST_AND_WARNING_MESSAGE()
- if_no_files_create_new_entries _AND_WARNING_MESSAGE()
- if_exception_clear_entries_and_log _AND_ERROR_MESSAGE()
- loaded_entries_init_called _AND_SUCCESS_MESSAGE()
- Other tests

OnRecover()

- if_file_exists_load_entries           _AND_INFO_MESSAGE()
- if_file_missing_load_last _AND_INFO_MESSAGE()
- if_no_files_create_new_entries _AND_INFO_MESSAGE()
- if_exception_clear_entries_and_log _AND_ERROR_MESSAGE_AND_SHUTDOWN()
- loaded_entries_init_called _AND_SUCCESS_MESSAGE()
- Other tests

我正在考虑使用策略模式封装私有(private)方法,这样我就可以单独测试它(和公共(public)方法)。

但是,我觉得使用一个不合适,因为:

  • 我不打算在运行时有可互换的行为
  • 为了更容易测试而使用模式似乎是错误的

更新#1

我的问题与测试私有(private)方法行为的公共(public)接口(interface)有关。但我最终得到了很多重复的测试方法(见我上面的例子)。

有了策略模式,我想我需要的是:

  • 测试策略中的所有路径(本质上,测试私有(private)路径方法)
  • 验证所有公共(public)方法都调用了该策略(可以在此处轻松使用模拟对象,并验证它是否已被调用)

但是正如我提到的,我认为我不应该仅仅为了更容易测试而引入模式。除非我真的必须这样做,否则我不会采用这种方法。


更新#2

第一次尝试减少重复:

  • 私有(private)方法测试分组到它自己的类中 (Behaviour1Test)

    • GetTestCases() 返回与此行为相关的测试用例列表
  • 所有需要这个测试的公共(public)方法实现暴露的接口(interface)

    • 安排()
    • 行动()
    • 断言()

例如:

// Public method tests
[TestFixture]
public class PublicMethodTests: IBehaviour1Test
{
// Behaviour 1
Behaviour1Test _behaviour1;
IEnumerable<TestCaseData> Behaviour1TestCases{ get { return _behaviour1.GetTestCases(); } }
[Test]
[TestCaseSource("Behaviour1TestCases")]
public void RunBehaviour1Test(Action<IBehaviour1Test> runTestCase)
{
runTestCase(this);
}

// ==============================
// Behaviour 1 Arrange/act/assert
void IBehaviour1Test.Arrange(){}
void IBehaviour1Test.Assert(object result){}
object IBehaviour1Test.Act()
{
return _model.PublicMethod();
}

// Other tests
}

// Implement this in order to run Behaviour1 test cases
interface IBehaviour1Test
{
void Arrange();
object Act();
void Assert(object retValue);
}

// Collection of tests for behaviour 1
public class Behaviour1Test
{
// Generate test cases
IEnumerable<TestCaseData>() GetTestCases()
{
yield return new TestCaseData((Action<IBehaviour1Test>)Test_1);
yield return new TestCaseData((Action<IBehaviour1Test>)Test_2);
yield return new TestCaseData((Action<IBehaviour1Test>)Test_3);
}

void Test_1(IBehaviour1Test impl)
{
// Arrange
impl.Arrange(); // public method's arrange
Test1Setup(); // Arrange for this test

// Act
var result = impl.Act();

// Assert
Test1Assert(result); // Assert for this test
impl.Assert(result); // Assert on public method

}

void Test_2(IBehaviour1Test impl){}
void Test_3(IBehaviour1Test impl){}
}

这样,如果我需要为私有(private)方法的行为添加一个新的测试用例,我只需要在 BehaviourTest 中添加一次,所有包含它的公共(public)方法测试都会被更新。

enter image description here

最佳答案

您应该在测试中应用与在应用程序代码中相同的理念。如果可以将通用功能提取到辅助方法或类中,那么您应该这样做。它将为您节省代码重复,并在私有(private)方法更改时帮助您稍后进行重构。

我想您有很多可以通用化的通用设置、拆卸、断言和验证代码。

关于unit-testing - 如何对使用相同私有(private)方法的公共(public)方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12639624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com