在android应用程序中使用测试数据

时间:2015-07-18 18:26:20

标签: android testing android-testing

目前我正在开发Android应用程序。此应用程序使用的数据由Web服务器提供。现在我想测试应用程序并使用测试数据对其进行一些操作,导致来自服务器的真实数据动态变化,并且我并不总是能够测试特定功能或查看特定内容。我想到的两个选择是:

  • 将测试数据存储在本地数据库/文件中。添加一个全局变量,如 boolean useTestData ,并更改Web服务器连接器,以便在 useTestData 设置为true时不接触Web服务器。缺点是,我必须使用代码修改所有连接器,这些连接器不会在发布的应用程序中使用。

  • 实现第二个Web服务器API用于测试目的,它将仅提供我需要的静态测试数据。如果全局变量设置为true,则将访问测试API。

我认为第二种方式是更好的选择。也许还有其他一些替代方法吗?你怎么看待这个?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我在这里看到的最好方法是进行依赖注入。你的建议有什么问题(简要):

  1. 您将破坏连接器的逻辑。连接器不能依赖于您的测试。

  2. 您正在思考正确的方向,但如果您失去连接或服务器崩溃,您会怎么做?这种方法使您的测试有点不稳定。测试结果将取决于运行测试的计算机的服务器和网络连接的状态,也可能取决于其他内容。那是错的。如果您的代码编写得很好,测试必须始终成功,我的意思是不管其他什么代码。

  3. 所以我建议从连接器中抽象出来。

    public interface IConnector {
        // e.g.
        public JSONObject getData(String what);
    }
    
    public class Connector implements IConnector {
        public JSONObject getData(String what) {
            // actual implementation that is already written
            // here you make requests to server and so forth
        }
    }
    
    // mock implementation of your api
    public class TestConnector implements IConnector {
        public JSONObject getData(String what) {
            // predictable behaviour without requests to server
        }
    }
    
    public class MyActivity extends Activity {
        public IConnector connector = new Connector();
    
        /**
         * This method substitutes implementation of connector.
         * Use this for testing purposes.
         */
        public void setConnector(IConnector impl) {
            connector = impl;
        }
    
        //rest of the code...
    }
    

    然后,您将在测试中获得可预测和威慑行为,而无需对代码进行大量更改。

    顺便说一句,我听说过Dagger。这是依赖注入的库,应该在这种情况下有所帮助。但是我没有时间去尝试,所以不能说出明确的信息。

    希望这对你有帮助。