Flutter入门13 -- 测试-编译-发布

2022-02-12  本文已影响0人  YanZi_33

单元测试

dev_dependencies:
  flutter_test:
    sdk: flutter
class SFCounter {
  int value = 0;
  int intcrement() => value++;
  int decrement() => value--;
}

第三步:创建测试文件counter_test,测试代码如下:

import 'package:TestDemo/counter.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  
  group("counter class test", () {
    SFCounter counter;
    
    setUpAll(() {
      counter = SFCounter();
    });
    
    test("counter test", () {
      expect(counter.value, 0);
    });
    
    test("counter increment method", () {
      counter.intcrement();
      expect(counter.value, 1);
    });

    test("counter decrement method", () {
      counter.decrement();
      expect(counter.value, 0);
    });
  });
}
image.png image.png

Widget测试

import 'package:flutter/material.dart';

class SFContacts extends StatelessWidget {
  final List<String> _names;
  SFContacts(this._names);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("联系人列表"),
      ),
      body: ListView(
        children: _names.map((name) {
          return ListTile(
            leading: Icon(Icons.people),
            title: Text(name),
          );
        }).toList(),
      ),
    );
  }
}
import 'package:TestDemo/contacts.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets("test Contacts widget", (WidgetTester tester) async {
    //注入widget
    await tester.pumpWidget(MaterialApp(home: SFContacts(["aaa","bbb","ccc"])));
    
    //在SFContacts查找widget
    final aaaText = find.text("aaa");
    final bbbText = find.text("bbb");
    final cccText = find.text("ccc");
    final icons = find.byIcon(Icons.people);
    
    //断言
    expect(aaaText, findsOneWidget);
    expect(bbbText, findsOneWidget);
    expect(cccText, findsOneWidget);
    expect(icons, findsNWidgets(3));
  });
}

集成测试

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              key: ValueKey("counter"),
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        key: ValueKey("increment"),
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}
dev_dependencies:
  flutter_driver:
    sdk: flutter
  flutter_test:
    sdk: flutter
  test: any
image.png
import 'package:flutter_driver/driver_extension.dart';
import 'package:TestDemo/main.dart' as app;

void main() {
  //1.初始化Driver
  enableFlutterDriverExtension();

  //2.启动应用程序
  app.main();

}

import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';

void main() {
  group("counter application test", () {
    FlutterDriver driver;
    
    setUpAll(() async {
      driver = await FlutterDriver.connect();
    });

    tearDownAll(() {
      driver.close();
    });
    
    final textFinder = find.byValueKey("textKey");
    final buttonFinder = find.byValueKey("buttonKey");
    
    test("test default value", () async {
      expect(await driver.getText(textFinder), "0");
    });
    
    test("floatingActionButton click", () async {
      await driver.tap(buttonFinder);
      expect(await driver.getText(textFinder), "1");
    });
    
  });
}

编译

debug模式
release模式
profile模式
开发中模式区分
String baseURL = "production baseURL";
assert(() {
  baseURL = "development baseURL";
  return true;
}());
String baseURL = kReleaseMode ? "production baseURL": "development baseURL";

打包发布

Android打包和发布
第一步:填写应用配置
image.png image.png
第二步:应用程序签名
storePassword=<上一步骤中的密码>
keyPassword=<上一步骤中的密码>
keyAlias=key
storeFile=<密钥库的位置,e.g. /Users/<用户名>/key.jks>
image.png
# Android ignore
/android/key.properties
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
image.png
signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
Snip20211105_42.png
第三步:打包应用程序
第四步:发布应用程序

iOS打包和发布

image.png
上一篇 下一篇

猜你喜欢

热点阅读